AssemblyLoadContext Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Stellt das Laufzeitkonzept eines Bereichs für das Laden von Assemblys dar.
public ref class AssemblyLoadContext
public ref class AssemblyLoadContext abstract
public class AssemblyLoadContext
public abstract class AssemblyLoadContext
type AssemblyLoadContext = class
Public Class AssemblyLoadContext
Public MustInherit Class AssemblyLoadContext
- Vererbung
-
AssemblyLoadContext
Hinweise
Das AssemblyLoadContext stellt einen Ladekontext dar. Konzeptionell erstellt ein Ladekontext einen Bereich zum Laden, Auflösen und potenziell Entladen einer Gruppe von Assemblys.
Das AssemblyLoadContext existiert in erster Linie, um die Isolierung beim Laden von Assemblys zu gewährleisten. Sie ermöglicht es mehreren Versionen derselben Assembly, innerhalb eines einzelnen Prozesses zu laden. Es ersetzt die Isolationsmechanismen, die von mehreren AppDomain Instanzen in .NET Framework bereitgestellt werden.
Note
- AssemblyLoadContext stellt keine Sicherheitsfeatures bereit. Der gesamte Code verfügt über vollständige Berechtigungen für den Prozess.
- In .NET Core 2.0 - 2.2 ist nur AssemblyLoadContext eine abstrakte Klasse. Implementieren Sie die AssemblyLoadContext.Load(AssemblyName) Methode, um eine konkrete Klasse in diesen Versionen zu erstellen.
Verwendung in der Runtime
Die Laufzeit implementiert zwei Assemblyladekontexte:
- AssemblyLoadContext.Default stellt den Standardkontext der Laufzeit dar, der für die Hauptassembly der Anwendung und deren statische Abhängigkeiten verwendet wird.
- Die Methode Assembly.LoadFile(String) isoliert die geladenen Assemblies, indem sie das einfachste AssemblyLoadContext instanziiert. Sie verfügt über ein einfaches Isolationsschema, das jede Assembly in ihrer eigenen AssemblyLoadContext ohne Auflösung von Abhängigkeiten lädt.
Anwendungsnutzung
Eine Anwendung kann ihr eigenes AssemblyLoadContext erstellen, um maßgeschneiderte Lösungen für erweiterte Szenarien zu entwickeln. Die Anpassung konzentriert sich auf die Definition von Abhängigkeitsauflösungsmechanismen.
Der AssemblyLoadContext bietet zwei Erweiterungspunkte zur Implementierung der verwalteten Assembly-Auflösung:
- Die AssemblyLoadContext.Load(AssemblyName) Methode bietet die erste Möglichkeit, die AssemblyLoadContext Assembly aufzulösen, zu laden und zurückzugeben. Wenn die Methode AssemblyLoadContext.Load(AssemblyName)
nullzurückgibt, versucht das Ladeprogramm, die Assembly in die AssemblyLoadContext.Default zu laden. - Wenn die AssemblyLoadContext.Default Assembly nicht aufgelöst werden kann, erhält das Original AssemblyLoadContext eine zweite Chance, die Assembly aufzulösen. Die Runtime löst das Ereignis Resolving aus.
Zusätzlich bietet die virtuelle Methode AssemblyLoadContext.LoadUnmanagedDll(String) die Möglichkeit, die Standardauflösung für nicht verwaltete Assemblys anzupassen. Die Standardimplementierung gibt zurück null, wodurch die Laufzeitsuche die Standardsuchrichtlinie verwendet. Die Standardmäßige Suchrichtlinie ist für die meisten Szenarien ausreichend.
Technische Herausforderungen
Es ist nicht möglich, mehrere Versionen der Laufzeit in einem einzigen Prozess zu laden.
Caution
Das Laden mehrerer Kopien oder verschiedener Versionen von Frameworkassemblys kann zu unerwartetem und schwer zu diagnostizierenden Verhalten führen.
Tipp
Verwenden Sie Prozessgrenzen mit Remoting oder Interprocess-Kommunikation, um dieses Isolationsproblem zu lösen.
Der Zeitpunkt des Ladens einer Assembly kann das Testen und Debuggen erschweren. Assemblys werden normalerweise geladen, ohne dass ihre Abhängigkeiten sofort aufgelöst werden. Die Abhängigkeiten werden geladen, wenn sie benötigt werden:
- Wenn Code in eine abhängige Assembly verzweigt.
- Wenn Code Ressourcen lädt.
- Wenn Code Assemblys explizit lädt.
Die Implementierung von AssemblyLoadContext.Load(AssemblyName) kann neue Abhängigkeiten hinzufügen, die möglicherweise isoliert werden müssen, damit verschiedene Versionen nebeneinander existieren können. Die natürlichste Implementierung würde diese Abhängigkeiten im Standardkontext platzieren. Das sorgfältige Design kann die neuen Abhängigkeiten isolieren.
Dieselbe Assembly wird mehrmals in verschiedene Kontexte geladen.
- Dies kann zu verwirrenden Fehlermeldungen führen, z. B. "Das Objekt vom Typ 'Sample.Plugin' kann nicht in den Typ 'Sample.Plugin' konvertiert werden."
- Das Marshalling über Isolationsgrenzen hinweg ist nicht trivial. Eine typische Lösung besteht darin, eine in einer Assembly definierte Schnittstelle zu verwenden, die nur in den Standardladekontext geladen wird.
Konstruktoren
| Name | Beschreibung |
|---|---|
| AssemblyLoadContext() |
Initialisiert eine neue Instanz der AssemblyLoadContext-Klasse. |
| AssemblyLoadContext(Boolean) |
Initialisiert eine neue Instanz der AssemblyLoadContext Klasse mit einem Wert, der angibt, ob das Entladen aktiviert ist. |
| AssemblyLoadContext(String, Boolean) |
Initialisiert eine neue Instanz der AssemblyLoadContext Klasse mit einem Namen und einem Wert, der angibt, ob das Entladen aktiviert ist. |
Eigenschaften
| Name | Beschreibung |
|---|---|
| All |
Gibt eine Auflistung aller AssemblyLoadContext Instanzen zurück. |
| Assemblies |
Gibt eine Auflistung der instanzen zurück, die Assembly in der AssemblyLoadContext. |
| CurrentContextualReflectionContext |
Ruft den AssemblyLoadContext Satz durch den letzten Aufruf von EnterContextualReflection(). |
| Default |
Ruft den Standardwert AssemblyLoadContextab. Der Standardkontext enthält die Hauptanwendungsassembly und die statischen Abhängigkeiten. |
| IsCollectible |
Ruft einen Wert ab, der angibt, ob dies AssemblyLoadContext sammelbar ist. |
| Name |
Rufen Sie den Namen der AssemblyLoadContext. |
Methoden
| Name | Beschreibung |
|---|---|
| EnterContextualReflection() |
Legt auf CurrentContextualReflectionContext |
| EnterContextualReflection(Assembly) |
Legt den Wert CurrentContextualReflectionContext fest, der AssemblyLoadContext die Assembly geladen hat. |
| Equals(Object) |
Bestimmt, ob das angegebene Objekt dem aktuellen Objekt entspricht. (Geerbt von Object) |
| Finalize() |
Ermöglicht es dem Objekt, Ressourcen freizugeben und andere Bereinigungsvorgänge auszuführen, bevor es von der Garbage Collection beansprucht wird. |
| GetAssemblyName(String) |
Ruft einen AssemblyName Assemblypfad ab. |
| GetHashCode() |
Dient als Standardhashfunktion. (Geerbt von Object) |
| GetLoadContext(Assembly) |
Ruft das AssemblyLoadContext enthaltende die angegebene Assemblyab. |
| GetType() |
Ruft die Type der aktuellen Instanz ab. (Geerbt von Object) |
| Load(AssemblyName) |
Wenn eine abgeleitete Klasse überschrieben wird, kann eine Assembly basierend auf der AssemblyNamezugehörigen Aufgelöst werden. |
| LoadFromAssemblyName(AssemblyName) |
Löst und lädt eine Assembly aufgrund der zugehörigen AssemblyName. |
| LoadFromAssemblyPath(String) |
Lädt den Inhalt einer Assemblydatei auf dem angegebenen Pfad. |
| LoadFromNativeImagePath(String, String) |
Lädt den Inhalt des systemeigenen Images einer verwalteten Assemblydatei im angegebenen Pfad. |
| LoadFromStream(Stream, Stream) |
Lädt die Assembly mit einem allgemeinen Objektdateiformat (COFF)-basierten Image, das eine verwaltete Assembly enthält, optional auch Symbole für die Assembly. |
| LoadFromStream(Stream) |
Lädt die Assembly mit einem gemeinsamen Objektdateiformat (COFF)-basierten Image, das eine verwaltete Assembly enthält. |
| LoadUnmanagedDll(String) |
Ermöglicht abgeleiteten Klassen das Laden einer nicht verwalteten Bibliothek anhand des Namens. |
| LoadUnmanagedDllFromPath(String) |
Lädt eine nicht verwaltete Bibliothek aus dem angegebenen Pfad. |
| MemberwiseClone() |
Erstellt eine flache Kopie der aktuellen Object. (Geerbt von Object) |
| SetProfileOptimizationRoot(String) |
Legt den Stammpfad fest, in dem die Optimierungsprofile für diesen Ladekontext gespeichert werden. |
| StartProfileOptimization(String) |
Startet die Profiloptimierung für das angegebene Profil. |
| ToString() |
Gibt die Zeichenfolgendarstellung dieses Ladekontexts zurück. |
| ToString() |
Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt. (Geerbt von Object) |
| Unload() |
Initiiert ein Entladen dieses AssemblyLoadContextVorgangs. |
Ereignisse
| Name | Beschreibung |
|---|---|
| Resolving |
Tritt auf, wenn die Auflösung einer Assembly fehlschlägt, wenn versucht wird, in diesen Assemblyladekontext zu laden. |
| ResolvingUnmanagedDll |
Tritt auf, wenn die Auflösung einer systemeigenen Bibliothek fehlschlägt. |
| Unloading |
Tritt auf, wenn der AssemblyLoadContext Vorgang entladen wird. |