Wie kann ich das InternalsVisibleTo-Attribut aktivieren, indem ich einen öffentlichen Token-Schlüssel sicher signiere?

9

Ich versuche einige Interna zu meinem Unit-Test-Projekt zu enthüllen mit:

%Vor%

Aber ich bekomme den Fehler:

  

Fehler 1 Freundschaftsreferenz MyTest 'ist ungültig. Starker Name   signierte Assemblys müssen einen öffentlichen Schlüssel in ihrem Namen angeben   InternalsVisibleTo-Deklarationen. ... / MyClass.cs ...

Wenn ich einen PublicTokenKey manuell zuweisen:

%Vor%

Die Lösung wird ohne Fehler erstellt.

  1. Warum muss ich ein Token für öffentliche Schlüssel hinzufügen?
  2. Ich bin nicht sicher, ob ich etwas in der Produktion brechen werde, indem ich das öffentliche Schlüssel-Token einfüge.

Also, Was ist der beste und sicherste Weg, meinem Testprojekt einen öffentlichen Schlüssel zuzuweisen?

    
pencilCake 25.08.2011, 13:38
quelle

1 Antwort

7

Ich bin überrascht, dass PublicKeyToken sogar funktioniert - auf meinem Rechner zwingt es mich, PublicKey

zu verwenden
  1. Der Grund, warum Sie ein Token mit einem öffentlichen Schlüssel benötigen, ist, dass Assemblys mit starkem Namen in den GAC eingefügt werden können, der eine hohe Vertrauenswürdigkeit besitzt. Es wäre eine Sicherheitslücke, wenn eine Assembly namens "MyTest" (die möglicherweise nicht vertrauenswürdig ist - z. B. ein Steuerelement im Browser) in die Interna einer GACed-Assembly aufrufen könnte. Es möchte, dass der öffentliche Schlüssel diese Art von Hack verhindert.

  2. Dies sollte nichts in der Produktion brechen - auch wenn die Assembly nicht gefunden werden kann. Dieses Attribut wird während der Kompilierungszeit und nicht zur Laufzeit verwendet.

Was ist der sicherste Weg?

Wenn Sie sich wirklich Sorgen darüber machen, dass der Produktionscode unterbrochen wird, entfernen Sie das Attribut während der Erstellung der Version:

%Vor%

Wenn Sie ein paar Projekte haben, die das öffentliche Schlüsseltoken benötigen (und Sie haben ein einziges Schlüsselpaar, was Sie tun sollten), könnten Sie auch eine Datei wie AssemblyInfo.global.cs definieren und sie allen Ihren Projekten als verknüpfte Datei hinzufügen :

%Vor%

Dies vereinfacht Dinge (besonders wenn Sie PublicKey verwenden müssen, was wirklich ist):

%Vor%     
Jonathan Dickinson 25.08.2011 14:07
quelle