2009-08-05 6 views
8

Wie werden Assemblys in .NET aufgelöst. Ich meine, wie wird eine Assembly mit einem vollständig qualifizierten Namen aufgelöst. Ich bin verwirrt über die öffentlichen/privaten Schlüssel Tokens und starke Benennung. DankeWie wird eine Assembly in .NET aufgelöst?

EDIT: Ich habe auch über verzögerte Unterzeichnung und solche Sachen gelesen. Benutzen die Leute es wirklich? (Hat jemand tatsächlich die verzögerte Signierung verwendet?) Wer generiert den Schlüssel zum Signieren einer Assembly? Es tut mir leid, wenn ich zu viele Fragen stelle. Aber ich bin verwirrt über diese ganze Sache.

Antwort

14

Starke Benennung wird zusammen mit einem "öffentlichen Schlüssel-Token" verwendet, um eine Baugruppe vollständiger Anzeigename (mscorlib, version=2.0.0.0, Culture=neutral, PublicKeyToken=b4778,.....) zu erstellen. Dies ermöglicht uns, mehrere Versionen derselben Baugruppe nebeneinander innerhalb desselben Anwendungsverzeichnisses zu haben.

Ein Token für öffentliche Schlüssel (und damit String-Benennungstechnik) ermöglicht es dem .NET-Loader außerdem, festzustellen, ob jemand seit der Verteilung Ihrer Assembly-Inhalte manipuliert hat. Dies ist der Fall, denn wenn Sie eine Assembly mit Ihrem "privaten Token" signieren, generiert der Compiler einen Hashwert, der in die Assemblymetadaten eingebettet wird, die den öffentlichen Teil Ihres "privaten Tokens" beschreiben. Der Lader kann diesen Wert dann verwenden, um festzustellen, ob Ihre Baugruppe geändert wurde.

Bezüglich Lösung Baugruppen gibt es ein paar grundlegende Dinge zu beachten:

  • Probing Der Lader versucht Baugruppen zu finden, ein Basisverzeichnis „Sondierung“ -Technik. Dies bedeutet, dass es versucht, "MyAssembly.dll" (zum Beispiel) im Startverzeichnis der Anwendung zu finden, wenn nicht dort, dann in Unterverzeichnissen darunter. Wenn das Prüfen nicht "MyAssembly.dll" findet, wird das AppDomainAssemblyResolve Ereignis ausgelöst.

  • Maschine/Benutzer/Systemkonfiguration Die machine.config, user.config und system.config werden Konfigurationsdateien lokal auf dem System gespeichert, die man verwenden kann, um das Verhalten der Baugruppe Resolver auf einer „Maschine“ zu ändern, „user“ oder Systemweite Einstellung

  • Verlag Politik Ein Ihre Anwendung die „<assemblyIdentity>“ XML-Token in der Konfigurationsdatei (zum Beispiel „MyApp.exe.config“) verwenden kann, um eine bestimmte Version einer Assembly an Resolver-zu-Punkt oder eine Baugruppe von einem laden anderer Ort.

  • Benutzerdefinierte Auflösung Behandeln Sie das "AssemblyResolve" Ereignis des AppDomain. Dieses Ereignis wird ausgelöst, wenn eine Versammlung nicht über „traditionelle“ Methoden aufgelöst werden konnte

Die mit Abstand am wenigsten komplizierte Mechanismus ist die „AssemblyResolve“ Ereignis zu behandeln.

Zusammenfassend sucht der Resolver im aktuellen Verzeichnis oder im globalen Assemblycache, verarbeitet die Richtlinie und ermöglicht schließlich die benutzerdefinierte Auflösung.

+0

"ermöglicht es dem .NET-Loader zu erkennen, ob irgendjemand Ihren Assembly-Inhalt manipuliert hat ...". –

+2

Sicher. Wenn Sie Ihre Assembly mit einem starken Namen-Hashwert kompilieren (Sie können auch das Befehlszeilendienstprogramm "sn.exe" verwenden), wird der Hashwert grundsätzlich in die Metadaten der Assembly geschrieben, die die Version, die Kultur, den Namen und den Tokenwert beschreibt. Wenn der Loader Ihre Assembly lädt, überprüft er, ob Ihre Assembly über ein Token mit öffentlichem Schlüssel verfügt. Wenn dies der Fall ist, wird der gleiche Hashalgorithmus für die Assembly verwendet, verglichen mit den Metadaten der Assembly und nicht geladen. So erkennt das geladene Gerät "Sabotage". Es ist sehr begrenzt, wie Sie sehen können, aber ausreichend für jetzt. –

+0

Auf der Oberfläche sieht es nach einer Möglichkeit aus, unseren .NET-Code zu schützen. Aber die Aufregung vergeht schnell und Sie werden bald feststellen, dass Verschleierung die nächstbeste Sache ist. –

1

Die Auflösung von Assemblys kann mehrere Schritte umfassen, je nachdem, wo die Assembly, die es zu laden versucht, liegt (GAC, Anwendungsbasisordner, Unterordner oder ein anderer Ordner außerhalb des Basisanwendungsordners).

Dies ist ein guter Artikel darüber, wie Sie angeben können, wo .Net nach Ihren Assemblys sucht. MSDN Article

Wenn Sie die Laufzeit wollen eine Baugruppe zu lösen, die nicht in Ihrer Anwendung Basisordner oder dem GAC gespeichert wird, dann müssen Sie für das AppDomain Ereignis registrieren, die ausgelöst wird, wenn es nicht die Montage finden. Sie würden dann auf dieses Ereignis reagieren, indem Sie überprüfen, ob die Datei an Ihrem anderen Speicherort vorhanden ist, und sie dann mit Assembly.LoadFrom (thePath) zurückgeben.

Gerade zu dieser Antwort hinzufügen weiter dieses Knacken Link ist, die für Sie sehr schön die ganze starke Namensgebung mit Tasten zusammenzufassen sollte: Strong Naming - keys etc..

Noch Fragen von diesem, fragen Sie einfach!

+0

Wer generiert den Schlüssel zum Signieren einer Baugruppe? –

2

Der folgende Artikel auf MSDN sollten Sie helfen:

http://msdn.microsoft.com/en-us/library/yx7xezcf(VS.71).aspx

Resolution in .NET ziemlich komplex sein können, als Baugruppen können in einer Vielzahl von Standorten einschließlich des GAC, colocated mit der Lage sein Ausführen von Assembly, Schattenkopie usw. Der allgemeine Prozess wird Fusion-Prozess genannt und stellt sicher, dass beim Laden von Assemblies die richtigen Sicherheitsmaßnahmen getroffen werden.

Verwandte Themen