Schritt 4: Suchen der Assembly mit CodeBases oder durch Sondierung
Aktualisiert: November 2007
Nachdem die richtige Assemblyversion mithilfe der Informationen aus dem Verweis der aufrufenden Assembly und der Konfigurationsdateien ermittelt worden ist und der globale Assemblycache (nur nach Assemblys mit starkem Namen) überprüft wurde, versucht die Common Language Runtime, die Assembly ausfindig zu machen. Die Suche nach einer Assembly setzt sich aus folgenden Schritten zusammen:
Wenn in der Anwendungskonfigurationsdatei ein <codeBase>-Element gefunden wird, überprüft die Common Language Runtime den angegebenen Speicherort. Wenn eine Übereinstimmung gefunden wird, wird diese Assembly verwendet und es findet keine Sondierung statt. Wird die Assembly dort nicht gefunden, schlägt die Bindungsanforderung fehl.
Die Common Language Runtime sucht daraufhin nach der Assembly, auf die verwiesen wurde, und wendet dabei die Regeln an, die weiter unten im Abschnitt erläutert werden.
Hinweis: |
---|
Wenn in einem Verzeichnis mehrere Versionen einer Assembly vorhanden sind und Sie auf eine bestimmte Version dieser Assembly verweisen möchten, dürfen Sie nicht das privatePath-Attribut des <probing>-Elements verwenden, sondern müssen das <codeBase>-Element verwenden. Wenn Sie das <probing>-Element verwenden, beendet die Laufzeit die Sondierung bei Auffinden der ersten Übereinstimmung einer Assembly mit dem einfachen Assemblynamen, auf den verwiesen wurde, unabhängig davon, ob es sich um eine vollständige Übereinstimmung handelt oder nicht. Bei einer korrekten Übereinstimmung wird diese Assembly verwendet. Wenn es sich nicht um eine korrekte Übereinstimmung handelt, wird die Sondierung beendet und die Bindung schlägt fehl. |
Assemblysuche mit CodeBases
CodeBase-Informationen können über ein <codeBase>-Element in einer Konfigurationsdatei zur Verfügung gestellt werden. Diese CodeBase wird stets vor der Suche nach der Assembly überprüft, auf die verwiesen wird. Enthält eine Herausgeberrichtliniendatei, in der die Umleitung der endgültigen Version enthalten ist, auch ein <codeBase>-Element, wird dieses <codeBase>-Element auch verwendet. Wenn beispielsweise Ihre Anwendungskonfigurationsdatei ein <codeBase>-Element festlegt, gleichzeitig aber eine Herausgeberrichtliniendatei, die Anwendungsinformationen überschreibt, ebenfalls ein <codeBase>-Element festlegt, wird das <codeBase>-Element in der Herausgeberrichtliniendatei verwendet.
Wenn keine Entsprechung in der vom <codeBase>-Element angegeben Position gefunden wird, schlägt die Bindungsanforderung fehl, und es werden keine weiteren Schritte ausgeführt. Wird durch die Common Language Runtime ermittelt, dass eine Assembly den Kriterien einer aufrufenden Assembly entspricht, wird diese Assembly verwendet. Während die vom <codeBase>-Element angegebene Datei geladen wird, überprüft die Common Language Runtime, ob Name, Version, Kultur und der öffentliche Schlüssel mit den Verweisdaten der aufrufenden Assembly übereinstimmen.
Hinweis: |
---|
Assemblys, auf die verwiesen wird und die außerhalb des Stammverzeichnisses der Anwendung gespeichert sind, müssen einen starken Namen aufweisen und entweder im globalen Assemblycache installiert sein oder mithilfe des <codeBase>-Elements angegeben werden. |
Assemblysuche durch Überprüfung
Wenn sich kein <codeBase>-Element in der Anwendungskonfigurationsdatei befindet, wird die Assembly nach folgenden Überprüfungskriterien gesucht:
Anwendungsbasis, die der Stammort für die Ausführung der Anwendung ist.
Kultur, die das Kulturattribut der Assembly darstellt, auf die verwiesen wird.
Name der Assembly, auf die verwiesen wird.
Das privatePath-Attribut des <probing>-Elements, also die benutzerdefinierte Liste von Unterverzeichnissen im Stammort. Dieser Speicherort kann in der Anwendungskonfigurationsdatei und in verwaltetem Code mithilfe der AppendPrivatePath-Eigenschaft für eine Anwendungsdomäne festgelegt werden. Im Fall der Festlegung in verwaltetem Code wird zuerst der privatePath des verwalteten Codes und daraufhin der in der Anwendungskonfigurationsdatei angegebene Pfad überprüft.
Überprüfen der Anwendungsbasis- und Kulturverzeichnisse
Die Common Language Runtime beginnt mit der Überprüfung immer in der Anwendungsbasis, die entweder eine URL oder das Stammverzeichnis der Anwendung auf einem Computer ist. Wird die Assembly, auf die verwiesen wird, in der Anwendungsbasis nicht gefunden und stehen keine Informationen über die Kultur zur Verfügung, durchsucht die Common Language Runtime alle Unterverzeichnisse mit diesem Assemblynamen. Zu den überprüften Verzeichnissen gehören:
[Anwendungsbasis] / [Assemblyname].dll
[Anwendungsbasis] / [Assemblyname] / [Assemblyname].dll
Wenn für die Assembly, auf die verwiesen wird, Informationen zur Kultur angegeben sind, werden nur die folgenden Verzeichnisse überprüft:
[Anwendungsbasis] / [Kultur] / [Assemblyname].dll
[Anwendungsbasis] / [Kultur] / [Assemblyname] / [Assemblyname].dll
Überprüfen mit dem privatePath-Attribut
Zusätzlich zu den Unterverzeichnissen der Kultur und den Unterverzeichnissen mit dem Namen der Assembly, auf die verwiesen wird, überprüft die Common Language Runtime auch Verzeichnisse, die mithilfe des privatePath-Attributs des <probing>-Elements angegeben werden. Die Verzeichnisse, die mit dem privatePath-Attribut angegeben werden, müssen Unterverzeichnisse des Stammverzeichnisses der Anwendung sein. Die überprüften Verzeichnisse unterscheiden sich, je nachdem, ob Informationen zur Kultur in der Anforderung der Assembly enthalten sind.
Die Laufzeit beendet die Sondierung bei Auffinden der ersten Übereinstimmung einer Assembly mit dem einfachen Assemblynamen, auf den verwiesen wurde, unabhängig davon, ob es sich um eine vollständige Übereinstimmung handelt oder nicht. Bei einer korrekten Übereinstimmung wird diese Assembly verwendet. Wenn es sich nicht um eine korrekte Übereinstimmung handelt, wird die Sondierung beendet und die Bindung schlägt fehl.
Wenn Informationen zur Kultur enthalten sind, erfolgt die Überprüfung der folgenden Verzeichnisse:
[Anwendungsbasis] / [bin-Pfad] / [Kultur] / [Assemblyname].dll
[Anwendungsbasis] / [bin-Pfad] / [Kultur] / [Assemblyname] / [Assemblyname].dll
Wenn keine Informationen zur Kultur enthalten sind, werden die folgenden Verzeichnisse überprüft:
[Anwendungsbasis] / [bin-Pfad] / [Assemblyname].dll
[Anwendungsbasis] / [bin-Pfad] / [Assemblyname] / [Assemblyname].dll
Beispiele einer Überprüfung
Folgende Informationen stehen zur Verfügung:
Name der Assembly, auf die verwiesen wird: myAssembly
Stammverzeichnis der Anwendung: http://www.code.microsoft.com
Angabe im <probing>-Element der Konfigurationsdatei: bin
Kultur: de
Die Common Language Runtime überprüft die folgenden URLs:
http://www.code.microsoft.com/de/myAssembly.dll
http://www.code.microsoft.com/de/myAssembly/myAssembly.dll
http://www.code.microsoft.com/bin/de/myAssembly.dll
http://www.code.microsoft.com/bin/de/myAssembly/myAssembly.dll
Mehrere Assemblys mit dem gleichen Namen
Das folgende Beispiel zeigt, wie mehrere Assemblys mit dem gleichen Namen konfiguriert werden.
<dependentAssembly>
<assemblyIdentity name="Server" publicKeyToken="c0305c36380ba429" />
<codeBase version="1.0.0.0" href="v1/Server.dll"/>
<codeBase version="2.0.0.0" href="v2/Server.dll"/>
</dependentAssembly>
Weitere überprüfte Speicherorte
Der Speicherort einer Assembly kann auch mithilfe des aktuellen Bindungskontextes ermittelt werden. Dieses Verfahren kommt besonders häufig bei Verwendung der Assembly.LoadFrom-Methode oder in Szenarien mit COM-Interop zum Einsatz. Wenn eine Assembly die LoadFrom-Methode verwendet, um auf eine andere Assembly zu verweisen, wird der Speicherort der aufrufenden Assembly als Hinweis auf den Speicherort der Assembly angesehen, auf die verwiesen wird. Bei gefundener Übereinstimmung wird diese Assembly geladen. Besteht keine Übereinstimmung, setzt die Common Language Runtime die Suche mit der entsprechenden Semantik fort und fordert Windows Installer auf, die Assembly zur Verfügung zu stellen. Wenn keine Assembly zur Verfügung gestellt wird, die mit der Bindungsanforderung übereinstimmt, wird eine Ausnahme ausgelöst. Bei der Ausnahme handelt es sich um eine TypeLoadException in verwaltetem Code, sofern auf einen Typ verwiesen wurde, oder um eine FileNotFoundException, sofern die geladene Assembly nicht gefunden wurde.
Wenn beispielsweise Assembly1 auf Assembly2 verweist und Assembly1 von http://www.code.microsoft.com/utils heruntergeladen wurde, wird dieser Speicherort als Hinweis auf den Speicherort von Assembly2.dll angesehen. Die Common Language Runtime überprüft http://www.code.microsoft.com/utils/Assembly2.dll und http://www.code.microsoft.com/utils/Assembly2/Assembly2.dll, um die Assembly zu finden. Wenn Assembly2 in keinem der beiden Speicherorte vorhanden ist, wird eine Anfrage an Windows Installer gestellt.
Siehe auch
Konzepte
So sucht Common Language Runtime nach Assemblys
Bereitstellungsszenarien für .NET Framework-Anwendungen
Schritt 1: Untersuchen der Konfigurationsdateien
Schritt 2: Suchen nach Assemblys, auf die zuvor verwiesen wurde