Ich habe meinem Visual Studio 2005- Projekt eine schwach benannte Assembly hinzugefügt (die stark benannt ist). Ich erhalte jetzt den Fehler:
"Die referenzierte Assembly 'xxxxxxxx' hat keinen starken Namen."
Muss ich diese Versammlung von Drittanbietern unterschreiben?
Antworten:
Um diesen Fehler zu vermeiden, können Sie entweder:
Anweisungen zum Signieren von Assemblys von Drittanbietern finden Sie in .NET-fu: Signieren einer nicht signierten Assembly (ohne verzögerte Signierung) .
Unterzeichnung von Baugruppen von Drittanbietern
Das Grundprinzip, um eine Thirp-Party zu unterzeichnen, ist zu
Zerlegen Sie die Baugruppe mit
ildasm.exe
der Zwischensprache (IL) und speichern Sie sie:Erstellen Sie die Baugruppe neu und unterschreiben Sie sie:
Zusätzliche Referenzen korrigieren
Die obigen Schritte funktionieren einwandfrei, es sei denn, Ihre Drittanbieter-Assembly ( A.dll ) verweist auf eine andere Bibliothek ( B.dll ), die ebenfalls signiert werden muss. Sie können A.dll und B.dll mit den obigen Befehlen zerlegen, neu erstellen und signieren. Zur Laufzeit schlägt das Laden von B.dll jedoch fehl, da A.dll ursprünglich mit einem Verweis auf die nicht signierte Version von B.dll erstellt wurde .
Die Lösung für dieses Problem besteht darin, die in Schritt 1 oben generierte IL-Datei zu patchen. Sie müssen das öffentliche Schlüsseltoken von B.dll zur Referenz hinzufügen. Sie erhalten dieses Token, indem Sie anrufen
Das gibt Ihnen die folgende Ausgabe:
Die letzte Zeile enthält das Token für den öffentlichen Schlüssel. Sie müssen dann die IL von A.dll nach dem Verweis auf B.dll durchsuchen und das Token wie folgt hinzufügen:
quelle
Erweitern Sie die Projektdatei, die das Projekt verwendet, das keinen "starken Namensschlüssel" hat, und suchen Sie nach der
.snk
Datei (.StrongNameKey).Navigieren Sie im Windows Explorer zu dieser Datei (nur damit Sie wissen, wo sie sich befindet).
Zurück in Visual Studio im Projekt, das keinen "starken Namensschlüssel" hat, tun Sie dies
<Browse>
zu der.snk
Datei, die Sie zuvor gefunden habenDas sollte den Trick machen. Dies löste für mich ein Problem für ein Projekt, indem ich ein Formular in einem anderen Projekt in derselben Lösung verwendete.
Ich hoffe, es hilft.
quelle
Ich habe nach einer Lösung für das gleiche Problem gesucht und das Deaktivieren der Option "Baugruppe signieren" funktioniert für mich:
(Wie Sie vielleicht bemerken, stammt der Screenshot von VS2010, aber hoffentlich hilft er jemandem.)
quelle
Ich habe ein Tool geschrieben, mit dem Zeichenbaugruppen mit starken Namen automatisch erstellt werden können, einschließlich solcher, für die Sie keinen Quellcode haben, oder für Projekte, die abgebrochen wurden. Es verwendet viele der in den Antworten beschriebenen Techniken auf einfache Weise, ohne die Mängel oder Nachteile vorhandener Werkzeuge oder datierter Anweisungen.
http://brutaldev.com/post/2013/10/18/NET-Assembly-Strong-Name-Signer
Ich hoffe, dies hilft allen, die eine Versammlung von Drittanbietern unterzeichnen müssen, ohne durch Reifen springen zu müssen, um dorthin zu gelangen.
quelle
Sie können nicht signierte Assemblys verwenden, wenn Ihre Assembly ebenfalls nicht signiert ist.
quelle
Die Unterzeichnung der Versammlung von Dritten hat für mich funktioniert:
http://www.codeproject.com/Tips/341645/Referenced-assembly-does-not-have-a-strong-name
BEARBEITEN : Ich habe gelernt, dass es hilfreich ist, Schritte zu posten, falls der verlinkte Artikel nicht mehr gültig ist. Alle Kredite gehen an Hiren Khirsaria :
Führen Sie die Visual Studio-Eingabeaufforderung aus und wechseln Sie in das Verzeichnis, in dem sich Ihre DLL befindet.
For Example my DLL is located in
D:/hiren/Test.dll
Erstellen Sie nun die IL-Datei mit dem folgenden Befehl.
D:/hiren> ildasm /all /out=Test.il Test.dll
(Dieser Befehl generiert die Codebibliothek.)Generieren Sie einen neuen Schlüssel, um Ihr Projekt zu signieren.
D:/hiren> sn -k mykey.snk
Signieren Sie nun Ihre Bibliothek mit dem
ilasm
Befehl.D:/hiren> ilasm /dll /key=mykey.snk Test.il
quelle
So unterschreiben Sie eine nicht signierte Versammlung eines Drittanbieters
sn
ildasm
undilasm
sn –k Cool.Library.snk
um ein neues Schlüsselpaar zu erstellenildasm Cool.Library.dll /out:Cool.Library.il
die Bibliothek zu zerlegenmove Cool.Library.dll Cool.Library.unsigned.dll
um die ursprüngliche Bibliothek als Backup zu behaltenilasm Cool.Library.il /dll /resource=Cool.Library.res /key=Cool.Library.snk
die Bibliothek mit einem starken Namen wieder zusammenzusetzenpowershell -command "& {[System.Reflection.AssemblyName]::GetAssemblyName($args).FullName} Cool.Library.dll"
um den vollständig qualifizierten Namen der Baugruppe zu erhalten. Sie benötigen dieses Bit, wenn Sie in externen Konfigurationsdateien wie web.config oder app.config auf die DLL verweisen müssen.quelle
Ich hatte dieses Problem für eine App mit starkem Namen und musste es dann ändern, um auf eine nicht stark benannte Assembly zu verweisen. Daher habe ich im Abschnitt Signieren der Projekteigenschaften das Kontrollkästchen "Assembly signieren" deaktiviert, es wurde jedoch weiterhin beanstandet. Ich dachte, es müsste irgendwo ein Artefakt sein, das das Problem verursacht, da ich alles andere richtig gemacht habe und es genau das war. Ich habe die folgende Zeile gefunden und entfernt: [Assembly: AssemblyKeyFile ("yourkeyfilename.snk")] aus der Datei assemblyInfo.cs. Danach keine Build-Beschwerden mehr.
quelle
Ich bin mit einer ServiceStack-DLL darauf gestoßen, die ich mit Nuget installiert hatte. Es stellte sich heraus, dass ein weiterer Satz von DLLs verfügbar war, die als signiert gekennzeichnet waren. Dies ist nicht die Antwort für alle, aber Sie müssen möglicherweise nur nach einer vorhandenen signierten Version Ihrer Baugruppe suchen.
quelle
Für mich war mein Problem, dass ich zwei gleiche NuGet-Pakete mit unterschiedlichen Versionen installiert hatte.
quelle
Das Entfernen des Häkchens " Signieren der Baugruppe" unter der Registerkarte " Signieren " funktioniert wie von @Michal Stefanow angegeben.
Hier hinzufügen ist der einfachste Weg, um Ihre eigenen Dateien und / oder die Dateien anderer Personen zu signieren. Sie müssen diese Zeile nur unter der Befehlszeile "Ereignis nach dem Erstellen" hinzufügen:
Sie können die Dateien anderer Personen oder Ihre eigenen Dateien und beliebig viele Dateien signieren.
quelle
Alte Frage, aber ich bin überrascht, dass noch niemand ilmerge erwähnt hat. ilmerge stammt von Microsoft, wird jedoch nicht mit VS oder den SDKs geliefert. Sie können es jedoch hier herunterladen . Es gibt auch ein Github- Repository. Sie können auch von nuget installieren:
Benutzen:
Bei Bedarf können Sie mit sn (aus VS) Ihre eigene Schlüsseldatei generieren:
quelle
1> Register-PackageSource -ProviderName NuGet -Name NuGet -Location http://www.nuget.org/api/v2
2> Install-Package -Name ILMerge
3> $env:path += ';C:\Program Files\PackageManagement\NuGet\Packages\ilmerge.2.14.1208\tools'
4> ILMerge.exe .\packages\WireMock.Net.1.0.4.2\lib\net452\WireMock.Net.dll /keyfile:key.snk /out:WireMock.Net.dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /ndebug /lib:.\packages\Newtonsoft.Json.10.0.3\lib\net45\ /lib:.\packages\Handlebars.Net.1.9.0\lib\net40 /lib:.\packages\SimMetrics.Net.1.0.4\lib\net45 /lib:.\packages\Microsoft.Owin.2.0.2\lib\net45 /lib:.\packages\Owin.1.0\lib\net40 /lib:.\packages\Microsoft.Owin.Hosting.2.0.2\lib\net45 /lib:.\packages\MimeKitLite.2.0.1\lib\net45 /lib:.\packages\XPath2.1.0.5.1\lib\net40 /lib:.\packages\RestEase.1.4.4\lib\net45
Situation: Sie hatten Projekt A, B, C, D in Lösung X, Y.
Projekt A, B, C in X Projekt A, C, D in Y.
Ich brauche Projekt C in Projekt A, aber später benutze ich nicht. In bin Debug Projekt A hatte C.dll.
Wenn ich Lösung X kompiliere, ist alles gut (in dieser Lösung lösche ich Referenz A -> C.), aber in Lösung Y bekomme ich dieses Problem.
Die Lösung ist das Löschen von C.dll in Projekt A bin Debug
quelle
Stellen Sie zunächst sicher, dass alle Nuget-Pakete in allen Projekten Ihrer Lösung dieselbe Version haben. Sie möchten beispielsweise nicht, dass ein Projekt auf NLog 4.0.0.0 verweist und ein anderes Projekt auf NLog 4.1.0.0 verweist. Versuchen Sie dann, Nuget-Pakete mit neu zu installieren
Update-Paket-neu installieren
Ich hatte 3 Baugruppen von Drittanbietern, auf die von meiner Baugruppe A verwiesen wurde, und nur 2 wurden von meiner Baugruppe B in Verweise aufgenommen, die auch auf A verwiesen.
Der fehlende Verweis auf die Assembly eines Drittanbieters wurde durch den Befehl update package hinzugefügt, und der Fehler wurde behoben.
quelle