it-swarm.com.de

Wie behebt man den Fehler "Referenzierte Assembly hat keinen starken Namen"?

Ich habe meinem Visual Studio 2005 -Projekt (das stark benannt ist) eine schwach benannte Assembly hinzugefügt. Ich erhalte jetzt den Fehler:

"Referenzierte Assembly 'xxxxxxxx' hat keinen starken Namen"

Muss ich diese Versammlung von Drittanbietern unterzeichnen?

225
ng5000

Um diesen Fehler zu vermeiden, können Sie entweder:

  • Laden Sie die Assembly dynamisch oder
  • Unterschreiben Sie die Versammlung des Dritten.

Anweisungen zum Signieren von Assemblys von Drittanbietern finden Sie in . NET-fu: Signieren einer nicht signierten Assembly (ohne verzögerte Signierung).

Signieren von Baugruppen von Drittanbietern

Das Grundprinzip, um eine Thirp-Party zu unterzeichnen, ist zu

  1. Zerlegen Sie die Baugruppe mit ildasm.exe und speichern Sie die Zwischensprache (IL):

    ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll 
    
  2. Erstellen Sie die Assembly neu und unterschreiben Sie sie:

    ilasm /dll /key=myKey.snk thirdPartyLib.il
    

Weitere Referenzen korrigieren

Die obigen Schritte funktionieren einwandfrei, es sei denn, Ihre Assembly ( A.dll ) von Drittanbietern verweist auf eine andere Bibliothek ( B.dll ), die ebenfalls muss unterschrieben werden. Sie können sowohl A.dll als auch B.dll mit den obigen Befehlen zerlegen, neu erstellen und signieren, aber zur Laufzeit laden von B.dll schlägt fehl, weil A.dll ursprünglich mit einem Verweis auf das vorzeichenlose Version von B.dll .

Die Lösung für dieses Problem besteht darin, die in Schritt 1 generierte IL-Datei zu patchen. Sie müssen der Referenz das öffentliche Schlüsseltoken von B.dll hinzufügen. Sie erhalten dieses Token, indem Sie anrufen

sn -Tp B.dll 

das gibt Ihnen die folgende Ausgabe:

Microsoft (R) .NET Framework Strong Name Utility  Version 4.0.30319.33440
Copyright (c) Microsoft Corporation.  All rights reserved.

Public key (hash algorithm: sha1):
002400000480000094000000060200000024000052534131000400000100010093d86f6656eed3
b62780466e6ba30fd15d69a3918e4bbd75d3e9ca8baa5641955c86251ce1e5a83857c7f49288eb
4a0093b20aa9c7faae5184770108d9515905ddd82222514921fa81fff2ea565ae0e98cf66d3758
cb8b22c8efd729821518a76427b7ca1c979caa2d78404da3d44592badc194d05bfdd29b9b8120c
78effe92

Public key token is a8a7ed7203d87bc9

Die letzte Zeile enthält das Token des öffentlichen Schlüssels. Sie müssen dann die IL von A.dll nach dem Verweis auf B.dll durchsuchen und das Token wie folgt hinzufügen:

.Assembly extern /*23000003*/ MyAssemblyName
{
  .publickeytoken = (A8 A7 ED 72 03 D8 7B C9 )                         
  .ver 10:0:0:0
}
199
Dirk Vollmar

Erweitern Sie die Projektdatei, die ist, mit dem Projekt, das keinen "starken Namensschlüssel" hat, und suchen Sie nach dem .snk Datei (.StrongNameKey).

Durchsuchen Sie diese Datei in Windows Explorer (damit Sie wissen, wo sie sich befindet).

Zurück in Visual Studio in dem Projekt, das nicht "einen starken Namensschlüssel" hat, zu tun

  • Klicken Sie mit der rechten Maustaste auf die Projektdatei
  • Wählen Sie Eigenschaften
  • Wählen Sie "Signing tab" (auf der linken Seite)
  • Aktivieren Sie das Kontrollkästchen "Sign the Assembly".
  • Dann <Browse> zum .snk Datei, die Sie zuvor gefunden haben

Das sollte den Trick machen. Dies löste für mich ein Problem für ein Projekt, bei dem ein Formular in einem anderen Projekt in derselben Lösung verwendet wurde.

Ich hoffe, es hilft.

94
MrOli3000

Ich habe nach einer Lösung für das gleiche Problem gesucht und das Deaktivieren der Option "Sign the Assembly" funktioniert für mich:

enter image description here

(Wie Sie vielleicht bemerken, stammt der Screenshot von VS2010, aber hoffentlich hilft er jemandem)

57
Mars Robertson

Ich habe ein Tool geschrieben, mit dem Sie automatisch Zeichenassemblys mit starkem Namen erstellen können, einschließlich solcher, für die Sie nicht den Quellcode haben oder für die Projekte, die aufgegeben wurden. Es werden viele der in den Antworten beschriebenen Techniken auf einfache Weise verwendet, ohne dass die Mängel oder Nachteile vorhandener Werkzeuge oder datierter Anweisungen auftreten.

http://brutaldev.com/post/2013/10/18/NET-Assembly-Strong-Name-Signer

Hoffe, dies hilft allen, die eine Versammlung von Dritten unterzeichnen müssen, ohne durch Reifen springen zu müssen, um dorthin zu gelangen.

45
BrutalDev

Sie können nicht signierte Assemblys verwenden, wenn Ihre Assembly ebenfalls nicht signiert ist.

40

Die dritte Versammlung zu unterzeichnen, hat für mich funktioniert:

http://www.codeproject.com/Tips/341645/Referenced-Assembly-does-not-have-a-strong-name

[~ # ~] edit [~ # ~] : Ich habe erfahren, dass es hilfreich ist, Schritte zu posten, falls der verknüpfte Artikel nicht mehr gültig ist. Alle Kredite gehen an Hiren Khirsaria :

  1. Führen Sie die Eingabeaufforderung von Visual Studio aus und wechseln Sie in das Verzeichnis, in dem sich Ihre DLL befindet.

    For Example my DLL is located inD:/hiren/Test.dll

  2. Erstellen Sie nun die IL-Datei mit dem folgenden Befehl.

    D:/hiren> ildasm /all /out=Test.il Test.dll (dieser Befehl generiert die Codebibliothek)

  3. Generieren Sie einen neuen Schlüssel, um Ihr Projekt zu signieren.

    D:/hiren> sn -k mykey.snk

  4. Signieren Sie nun Ihre Bibliothek mit dem Befehl ilasm.

    D:/hiren> ilasm /dll /key=mykey.snk Test.il

22
mateuscb

So signieren Sie eine nicht signierte Drittanbieter-Assembly

  1. Öffnen Sie die Developer-Eingabeaufforderung für Visual Studio. Dieses Tool ist in Ihren Windows-Programmen verfügbar und kann mit der Standard-Windows-Suche gefunden werden.
  2. Stellen Sie sicher, dass Ihre Eingabeaufforderung Zugriff auf die folgenden Tools hat, indem Sie sie einmal ausführen: snildasm und ilasm
  3. Navigieren Sie zu dem Ordner, in dem sich Ihre Cool.Library.dll befindet
  4. sn –k Cool.Library.snk, Um ein neues Schlüsselpaar zu erstellen
  5. ildasm Cool.Library.dll /out:Cool.Library.il, Um die Bibliothek zu zerlegen
  6. move Cool.Library.dll Cool.Library.unsigned.dll, Um die Originalbibliothek als Backup zu behalten
  7. ilasm Cool.Library.il /dll /resource=Cool.Library.res /key=Cool.Library.snk, Um die Bibliothek mit einem starken Namen wieder zusammenzusetzen
  8. powershell -command "& {[System.Reflection.AssemblyName]::GetAssemblyName($args).FullName} Cool.Library.dll", um den vollständig qualifizierten Namen der Assembly abzurufen. Sie benötigen dieses Bit, wenn Sie auf die DLL in externen Konfigurationsdateien wie web.config oder app.config verweisen müssen.
14

Ich hatte dieses Problem für eine App mit starkem Namen, die dann geändert werden musste, um auf eine nicht stark benannte Assembly zu verweisen. Daher habe ich in den Projekteigenschaften das Kontrollkästchen "Assembly signieren" deaktiviert, aber es ist noch = beschwert. Ich nahm an, dass es irgendwo ein Artefakt sein musste, das das Problem verursachte, da ich alles andere richtig gemacht hatte und es genau das war. Ich habe die Zeile [Assembly: AssemblyKeyFile ("yourkeyfilename.snk")] in der Datei assemblyInfo.cs gefunden und entfernt. Dann keine Baumängel danach.

5
Joe

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 bereits signierten Version Ihrer Assembly suchen. ServiceStack.Signed

5
Henry Crans

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 von hier herunterladen. Es gibt auch ein github Repository. Sie können auch von Nuget installieren:

PM>Install-Package ilmerge

Benutzen:

ilmerge Assembly.dll /keyfile:key.snk /out:Assembly.dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /ndebug

Bei Bedarf können Sie mit sn (von VS) Ihre eigene Schlüsseldatei generieren:

sn -k key.snk
2
Jahmic

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 verwende ich nicht. In bin Debug-Projekt A hatte C.dll.

Wenn ich Lösung X kompiliere, ist alles in Ordnung (in dieser Lösung lösche ich Referenz A -> C.), aber in Lösung Y bekomme ich dieses Problem.

Lösung ist das Löschen von C.dll in Projekt A bin Debug

1
Martin9032

Für mich war mein Problem, dass ich zwei gleiche NuGet-Pakete mit unterschiedlichen Versionen installiert hatte.

1
Demodave

Entfernen des "Sign the Assembly" Häkchens unter dem "Signing" Tab funktioniert wie @Michal Stefanow sagte.

Hinzufügen ist der einfachste Weg, um Ihre eigenen Dateien und/oder Dateien anderer Personen zu signieren. Sie müssen nur diese Zeile unter der Befehlszeile "Post-Build-Ereignis" hinzufügen:

"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\signtool.exe" sign /f "$(ProjectDir)\YourPfxFileNameHere.pfx" /p YourPfxFilePasswordHere /d "Your software title here" /du http://www.yourWebsiteHere.com /t http://timestamp.verisign.com/scripts/timstamp.dll /v "$(BaseOutputPath)$(TargetFileName)"

Sie können die Dateien anderer Personen oder Ihre eigenen Dateien signieren und so viele, wie Sie möchten.

enter image description here

1
Pabinator