2015-06-19 5 views
6

Ich verwende das Attribut "InternalsVisibleTo" mit einer Assembly, um die internen Methoden/Klassen für mein Komponententestprojekt verfügbar zu machen.Wie Verwenden des "InternalsVisibleTo" -Attributs mit einer Assembly mit starkem Namen?

Ich muss jetzt diese Baugruppe in den GAC installieren, also muss ich ihm einen starken Namen geben. Wenn ich das tue, erhalte ich den folgenden Fehler in Visual Studio.

Strong-Namen unterzeichnet Baugruppen müssen einen öffentlichen Schlüssel in ihre InternalsVisibleTo Erklärungen geben

Ein bisschen Googlen brachte mich unten an den Artikel:

https://msdn.microsoft.com/en-us/library/bb763089.aspx

Dieser Artikel heißt es:

"Bestimmen Sie die Pu blic Schlüssel für die starke-named Freundversammlung. "

Dieser Artikel enthält keine Informationen zum Ermitteln des öffentlichen Schlüssels. Wo finde ich den öffentlichen Schlüssel für die Versammlung? Wenn ich den öffentlichen Schlüssel habe, wäre das der richtige Weg, das Attribut zu deklarieren?

[assembly: InternalsVisibleTo("Namespace.Assembly.Example.Name, PublicKey=ThePublicKey")] 
+0

Google ".net Assembly öffentlichen Schlüssel" und den ersten Treffer. –

+0

Ich habe das versucht. Es heißt, SN.exe zu verwenden, aber das funktioniert nur, wenn die Assembly stark signiert ist. Ich kann meine Assembly aufgrund des oben genannten Fehlers nicht als stark typisiert kompilieren. SN.exe gibt den Fehler ".dll stellt keine stark benannte Assembly dar" – Dave

+2

Scheint, du hast das Huhn und das Ei umgekehrt, du brauchst den öffentlichen Schlüssel der * anderen * Assembly. –

Antwort

8

Um InternalsVisibleTo mit stark unterzeichnet verwenden Montage Ihre „Freunde“ Baugruppen zu stark zu unterzeichnen.

Beachten Sie, dass das Attribut nicht für die tatsächliche Überprüfung der Assembly zum Zeitpunkt der Kompilierung verwendet wird - es gibt nur an, dass Laufzeitprüfungen (und Kompilierungszeitprüfungen für die Assembly eines Freundes) diese Identität validieren sollten. Wenn Sie also nur benötigen, um Ihre Hauptbaugruppe zu kompilieren, können Sie jedes öffentliche Schlüsseltoken angeben (d. H. Eines aus Microsoft-Assemblys, wie es beispielsweise in allen Assemblyverweisen in Ihrer Web.Config gefunden wird).

Da Sie normalerweise Assemblys signieren, kennen Sie den öffentlichen Schlüssel. I.e. Wenn Sie eine Snk-Datei als sn -t youSnk.snk haben, würde der öffentliche Schlüssel angezeigt. Oder Sie können die Schritte in Getting Public Key Token of Assembly Within Visual Studio befolgen, um Ihren VS so zu konfigurieren, dass er öffentliche Token für beliebige Assemblys anzeigt.

1

Wenn Sie Ihre Release-Konfiguration nicht testen können, ist dies eine einfache Abhilfe:

#if DEBUG 
[assembly: InternalsVisibleTo("TestProjNamespace")] 
#endif 
7

für jeden, die Visual Studio 2017 wird verwendet, ist die neueste Methode:

Von unserem geliebten IDE gehen, auf "tools> Externe tools ..." und "hinzufügen" ein neues Werkzeug mit diesen Einstellungen:

  • Titel: Get PublicKey
  • Befehl: "C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ V10.0A \ bin \ netfx 4.6.2 Tools \ Sn.exe" (/ \ wählen die NETFX-Tool-Version, die zu Ihrer Assembly-NETFX-Version passt, hier ist es 4.6.2)
  • Argumente: -Tp $ (TargetPath)
  • Überprüfen Sie die "Ausgabefenster verwenden" Checkbox

Nehmen/OK diese Änderungen.

In der "Solution Explorer" Klick auf Ihr Projekt Assemblierungsnamen, und fahren Sie dann auf "Tools> Get PublicKey". Das Ausgabefenster sollte den (ziemlich langen) öffentlichen Schlüssel zusammen mit dem öffentlichen Token Key anzeigen.

schließlich in dem Projekt, das die interne Klasse (dh dem geprüften Projekt) Sie aussetzen möchten, hält, öffnen Sie die „AssemblyInfo.cs“ Datei und fügen Sie die Zeile:

[assembly: InternalsVisibleTo ("MyCompany.SolutionName.ProjectName, PublicKey = Fügen Sie Ihren öffentlichen Schlüssel hier")]

/! \ Sie haben die Zeilenumbrüche aus dem öffentlichen Schlüssel zu entfernen.

Es funktionierte perfekt für mich, also hoffentlich wird es auch den Trick für Sie tun!

+1

Auch in Visual Studio 2015 gearbeitet :) – Kzrystof

+0

Nützlich. Vielen Dank. – qwertoyo

Verwandte Themen