Wie kann ich InternalsVisibleTo-Attribut arbeiten durch die Unterzeichnung eines öffentlich-token-Schlüssel sicher?
Ich versuche, setzen einige Interna zu meinem unit-test-Projekt mit:
[assembly: InternalsVisibleTo("MyTest")]
Aber ich bin immer der Fehler:
Fehler 1 Friend assembly reference MyTest' ist ungültig. Starke Namen
signierte Assemblys angeben müssen, einen öffentlichen Schlüssel in Ihre
InternalsVisibleTo-Deklarationen. .../MyClass.cs...
Wenn ich weisen Sie eine PublicTokenKey manuell:
[assembly: InternalsVisibleTo("MyTest, PublicKeyToken=XxxxxYysakf")]
Die Lösung baut ohne Fehler.
- Warum muss ich auf ein public-key-token?
- Ich bin nicht sicher, ob ich etwas zu brechen in der Produktion, einschließlich der public-key-token.
So, was ist die beste und sicherste Weise, die die Zuordnung eines öffentlichen Schlüssel zu meinem Test-Projekt?
- Sie sollten nicht zuweisen müssen, eine public-key-token. Aber Sie brauchen, um sicherzustellen, dass die assembly-Namen übereinstimmen.
- Ich bin kopieren und einfügen der Versammlung, die Namen von den Namen der Assembly-Feld angezeigt, in den Projekteigenschaften. So sollte es richtig sein, ich gues..
- Okay, also ich habe nicht begegnet diesem Problem mich, aber dieser Kerl hier vielleicht eine weitere option für Sie blog.tylerholmes.com/2008/04/...
- Die Lösung ohne Fehler erstellt wird, wenn Sie verwenden, PublicKeyToken, aber Intellisense könnte einen Hinweis darauf geben, dass die assembly-Verweis konnte nicht aufgelöst werden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin überrascht, dass
PublicKeyToken
auch funktioniert - auf meinem Rechner zwingt mich zu verwendenPublicKey
Den Grund, dass man eine public-key-token ist, da Assemblys mit starken Namen können einfach in die GAC - das große Vertrauen. Es wäre eine Sicherheitslücke, wenn jeder Versammlung namens 'MyTest' (das ist potentiell nicht vertrauenswürdig - z.B. ein Steuerelement im browser) nennen könnte, in die Interna eines GACed Versammlung; er will, den öffentlichen Schlüssel, um zu verhindern, dass diese Art von hack.
Sollte dies nicht etwas zu brechen, in der Produktion - auch wenn die assembly nicht gefunden werden kann. Dieses Attribut wird verwendet, während der Kompilierzeit und nicht zur Laufzeit.
Was ist der sicherste Weg?
Wenn Sie wirklich besorgt brechen Produktions-code, entfernen Sie das Attribut bei release-builds:
Wenn Sie ein paar Projekte, die benötigen das öffentliche schlüsseltoken (und Sie haben ein einziges Schlüsselpaar, das sollten Sie), könnten Sie auch eine Datei definieren, wie
AssemblyInfo.global.cs
und fügen Sie es als eine verknüpfte Datei, um alle Ihre Projekte:Dies vereinfacht die Dinge, um (vor allem, wenn Sie müssen, verwenden Sie die
PublicKey
die wirklich lang):