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.

  1. Ermitteln Sie den activeAssemblyLoadContext.

  2. Für die Load-by-name-Methoden lädt der activeAssemblyLoadContext die Assembly in der folgenden Prioritätsreihenfolge:

  3. Für die anderen zu ladenden Typen lädt der activeAssemblyLoadContext 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 der Instanz des activeAssemblyLoadContext ein Verweis hinzugefügt.
  4. In jedem Fall wird beim neuen Laden einer Assembly das AppDomain.AssemblyLoad-Ereignis ausgelöst.