Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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.
Ermitteln Sie den
active
AssemblyLoadContext.- Bei einem statischen Assemblyverweis ist
active
AssemblyLoadContext die Instanz, die die verweisende Assembly geladen hat. - Bevorzugte APIs machen die
active
AssemblyLoadContext explizite. - Andere APIs erkennen die
active
AssemblyLoadContext. Für diese APIs wird die AssemblyLoadContext.CurrentContextualReflectionContext Eigenschaft verwendet. Wenn der Wert lautetnull
, wird die abgeleitete AssemblyLoadContext Instanz verwendet. - Siehe die Tabelle im Abschnitt "Wann werden verwaltete Assemblys geladen?
- Bei einem statischen Assemblyverweis ist
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 Sie den Cache der AssemblyLoadContext.Default Instanz, und führen Sie standardmäßige Probinglogik für verwaltete Assemblys aus. Wenn eine Assembly neu geladen wird, wird ein Verweis auf die AssemblyLoadContext.Default Instanz
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 ein Verweis auf die
active
AssemblyLoadContext Instanzcache-by-name
hinzugefügt.
- Überprüfen von deren
In beiden Fällen wird das AppDomain.AssemblyLoad Ereignis ausgelöst, wenn eine Assembly neu geladen wird.