Ladealgorithmus für verwaltete Assemblys
Verwaltete Assemblys werden über einen aus mehreren Schritten bestehenden Algorithmus gesucht und geladen.
Für alle verwalteten Assemblys – mit Ausnahme von Satellitenassemblys und WinRT
-Assemblys – wird derselbe Algorithmus verwendet.
Wann werden verwaltete Assemblys geladen?
Das am häufigsten angewandte Verfahren, um das Laden einer verwalteten Assembly auszulösen, ist ein statischer Assemblyverweis. Diese Verweise werden vom Compiler immer dann eingefügt, wenn der Code einen in einer anderen Assembly definierten Typ verwendet. Diese Assemblys werden nach Bedarf von der Runtime geladen (load-by-name
). Der genaue Zeitpunkt, zu dem die statischen Assemblyverweise geladen werden, ist nicht angegeben. Er kann zwischen Runtimeversionen variieren und wird durch Optimierungen wie Inlining beeinflusst.
Die direkte Verwendung folgender APIs löst das Laden ebenfalls aus:
API | BESCHREIBUNG | Active AssemblyLoadContext |
---|---|---|
AssemblyLoadContext.LoadFromAssemblyName | Load-by-name |
Die this-Instanz. |
AssemblyLoadContext.LoadFromAssemblyPath AssemblyLoadContext.LoadFromNativeImagePath |
Aus dem Pfad laden | Die this-Instanz. |
AssemblyLoadContext.LoadFromStream | Aus einem Objekt laden | Die this-Instanz. |
Assembly.LoadFile | Aus dem Pfad in eine neue AssemblyLoadContext-Instanz laden | Die neue AssemblyLoadContext-Instanz. |
Assembly.LoadFrom | Aus dem Pfad in die AssemblyLoadContext.Default-Instanz laden Fügt einen AppDomain.AssemblyResolve-Handler hinzu. Der Handler lädt die Abhängigkeiten der Assembly aus dem zugehörigen Verzeichnis. |
Die AssemblyLoadContext.Default-Instanz. |
Assembly.Load(AssemblyName) Assembly.Load(String) Assembly.LoadWithPartialName |
Load-by-name . |
Vom Aufrufer abgeleitet. Verwenden Sie bevorzugt AssemblyLoadContext-Methoden. |
Assembly.Load(Byte[]) Assembly.Load(Byte[], Byte[]) |
Aus dem Objekt in eine neue AssemblyLoadContext-Instanz laden | Die neue AssemblyLoadContext-Instanz. |
Type.GetType(String) Type.GetType(String, Boolean) Type.GetType(String, Boolean, Boolean) |
Load-by-name . |
Vom Aufrufer abgeleitet. Verwenden Sie bevorzugt Type.GetType-Methoden mit einem assemblyResolver -Argument. |
Assembly.GetType | Wenn der Typ-name einen von der Assembly qualifizierten generischen Typ beschreibt, wird Load-by-name auslöst. |
Vom Aufrufer abgeleitet. Bevorzugen Sie Type.GetType, wenn Sie von der Assembly qualifizierte Typnamen verwenden. |
Activator.CreateInstance(String, String) Activator.CreateInstance(String, String, Object[]) Activator.CreateInstance(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[]) |
Load-by-name . |
Vom Aufrufer abgeleitet. Verwenden Sie bevorzugt Activator.CreateInstance-Methoden, die ein Type-Argument übernehmen. |
Algorithmus
Der folgende Algorithmus beschreibt, wie die Runtime eine verwaltete Assembly lädt.
Ermitteln Sie den
active
AssemblyLoadContext.- Bei einem statischen Assemblyverweis ist der
active
AssemblyLoadContext die Instanz, die die verweisende Assembly geladen hat. - Bei bevorzugten APIs wird der
active
AssemblyLoadContext explizit angegeben. - Andere APIs leiten den
active
AssemblyLoadContext ab. Für diese APIs wird die AssemblyLoadContext.CurrentContextualReflectionContext-Eigenschaft verwendet. Wenn der Wertnull
ist, wird die abgeleitete AssemblyLoadContext-Instanz verwendet. - Weitere Informationen finden Sie in der Tabelle im Abschnitt Wann werden verwaltete Assemblys geladen?.
- Bei einem statischen Assemblyverweis ist der
Für die
Load-by-name
-Methoden lädt deractive
-AssemblyLoadContext die Assembly in der folgenden Prioritätsreihenfolge:- Überprüfen von deren
cache-by-name
. - Rufen Sie die Funktion AssemblyLoadContext.Load auf.
- Überprüfen des Caches der AssemblyLoadContext.Default-Instanz und Ausführen der Logik für die Standardüberprüfung der verwalteten Assembly. Wenn eine Assembly neu geladen wird, wird ein Verweis auf die AssemblyLoadContext.Default-Instanz von
cache-by-name
hinzugefügt. - Auslösen des AssemblyLoadContext.Resolving-Ereignisses für den aktiven AssemblyLoadContext.
- Lösen Sie das AppDomain.AssemblyResolve-Ereignis aus.
- Überprüfen von deren
Für die anderen zu ladenden Typen lädt der
active
-AssemblyLoadContext die Assembly in der folgenden Prioritätsreihenfolge:- Überprüfen von deren
cache-by-name
. - Laden aus dem angegebenen Pfad oder dem unformatierten Assemblyobjekt. Wenn eine Assembly neu geladen wird, wird dem
cache-by-name
-Element deractive
-AssemblyLoadContext-Instanz ein Verweis hinzugefügt.
- Überprüfen von deren
In jedem Fall wird beim neuen Laden einer Assembly das AppDomain.AssemblyLoad-Ereignis ausgelöst.