Um diesen Fehler zu vermeiden, können Sie entweder:
- Laden Sie die Baugruppe dynamisch oder
- Unterzeichnen Sie die Versammlung eines Drittanbieters.
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:
ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll
Erstellen Sie die Baugruppe neu und unterschreiben Sie sie:
ilasm /dll /key=myKey.snk thirdPartyLib.il
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
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 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:
.assembly extern /*23000003*/ MyAssemblyName
{
.publickeytoken = (A8 A7 ED 72 03 D8 7B C9 )
.ver 10:0:0:0
}