Freigeben über


Ladealgorithmus für verwaltete Assemblys

Verwaltete Assemblys werden gefunden und mit einem Algorithmus geladen, der mehrere Stufen umfasst.

Alle verwalteten Assemblys außer Satellitenassemblys und WinRT Assemblys verwenden denselben Algorithmus.

Wann werden verwaltete Assemblys geladen?

Der häufigste Mechanismus zum Auslösen einer verwalteten Assemblylast ist ein statischer Assemblyverweis. Diese Verweise werden vom Compiler eingefügt, wenn Code einen typ verwendet, der in einer anderen Assembly definiert ist. 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. Es kann zwischen Laufzeitversionen variieren und durch Optimierungen wie Inlining beeinflusst werden.

Die direkte Verwendung der folgenden APIs löst auch Ladevorgänge aus:

Programmierschnittstelle (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.
Bevorzugen Sie Type.GetType Methoden mit einem assemblyResolver Argument.
Assembly.GetType Wenn der Typ name einen Typ mit Assembly-Qualifikation beschreibt, der generisch ist, lösen Sie einen Load-by-name aus. Vom Aufrufer abgeleitet.
Bevorzugen Sie Type.GetType, wenn Sie 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 Laufzeit 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 ein Verweis auf die activeAssemblyLoadContext Instanz cache-by-namehinzugefügt.
  4. In beiden Fällen wird das AppDomain.AssemblyLoad Ereignis ausgelöst, wenn eine Assembly neu geladen wird.