Wie wird eine Assembly in .NET aufgelöst?

8

Wie werden Assemblies 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. Danke

BEARBEITEN: Ich habe auch über das verzögerte Signieren 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.

    
P.K 05.08.2009, 19:30
quelle

3 Antworten

14

Die starke Benennung wird zusammen mit einem "öffentlichen Schlüsseltoken" verwendet, um einen vollständigen Anzeigenamen der Einheit zu erzeugen ( mscorlib, version=2.0.0.0, Culture=neutral, PublicKeyToken=b4778,..... ). Dies ermöglicht uns, mehrere Versionen derselben Baugruppe nebeneinander im selben Anwendungsverzeichnis zu haben.

Ein Public-Key-Token (und damit auch eine String-Benennungstechnik) ermöglicht es dem .NET-Loader außerdem, festzustellen, ob jemand Ihren Assembly-Inhalt manipuliert hat, seit Sie ihn verteilt haben. 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 dann diesen Wert verwenden, um festzustellen, ob Ihre Baugruppe geändert wurde.

Zum Auflösen von Assemblys gibt es einige grundlegende Dinge zu beachten:

  • Sondieren Der Loader versucht, Assemblys mithilfe einer grundlegenden "Sondierung" -Technik zu lokalisieren. Das bedeutet, dass es versucht, " MyAssembly.dll " (zum Beispiel) im Startverzeichnis der Anwendung zu finden, wenn nicht dort, dann in Unterverzeichnissen darunter. Wenn der Suchvorgang " MyAssembly.dll " nicht findet, wird das AppDomain -Ereignis des AssemblyResolve ausgelöst.

  • Rechner / Benutzer / Systemkonfiguration Die machine.config , user.config und system.config sind Konfigurationsdateien, die lokal auf dem System gespeichert sind und die verwendet werden können, um das Verhalten des Assembly-Resolvers bei einer Einstellung "Maschine", "Benutzer" oder "System" zu ändern / p>

  • Publisher-Richtlinie Man kann das XML-Token " <assemblyIdentity> " in der Konfigurationsdatei Ihrer Anwendung (zum Beispiel " MyApp.exe.config ") verwenden, um auf eine bestimmte Version einer Assembly zu verweisen oder eine Assembly von einem anderen Ort zu laden.

    >
  • Benutzerdefinierte Auflösung Behandle das Ereignis " AssemblyResolve " von AppDomain . Dieses Ereignis wird ausgelöst, wenn eine Assembly nicht mit "traditionellen" Methoden gelöst werden konnte.

Der am wenigsten komplizierte Mechanismus ist das Ereignis "AssemblyResolve".

Zusammenfassend: Der Resolver sucht im aktuellen Verzeichnis oder im globalen Assemblycache, verarbeitet die Richtlinie und erlaubt schließlich die benutzerdefinierte Auflösung.

    
Mike J 05.08.2009, 20:03
quelle
2

Der folgende Artikel auf MSDN sollte Ihnen helfen:

Ссылка

Die Auflösung der Assemblierung in .NET kann ziemlich komplex sein, da Assemblys an verschiedenen Stellen platziert werden können, z. B. GAC, mit der ausführenden Assembly verbunden, Schatten kopiert usw. Der allgemeine Prozess wird Fusion-Prozess genannt und stellt dies sicher Beim Laden von Baugruppen werden die richtigen Sicherheitsmaßnahmen getroffen.

    
jrista 05.08.2009 19:49
quelle
1

Das Auflösen 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 Assemblies sucht. MSDN-Artikel

Wenn die Laufzeit eine Assembly auflösen soll, die nicht in Ihrem Anwendungsbasisordner oder dem GAC gespeichert ist, müssen Sie sich für das AppDomain-Ereignis registrieren, das ausgelöst wird, wenn die Assembly nicht gefunden werden kann. 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.

Um diese Antwort noch weiter zu ergänzen, ist dieser knackende Link, der die ganze starke Benennung mit Schlüsseln sehr schön für Sie zusammenfassen sollte: Starke Namen - Schlüssel etc ..

Fragen dazu, fragen Sie einfach!

    
PentaPenguin 05.08.2009 19:46
quelle

Tags und Links