System.Runtime.Loader.AssemblyLoadContext-Klasse
Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.
Das AssemblyLoadContext stellt einen Ladekontext dar. Konzeptionell erstellt ein Ladekontext einen Bereich zum Laden, Auflösen und potenziell Entladen einer Gruppe von Assemblys.
Dies AssemblyLoadContext ist in erster Linie vorhanden, um die Isolation des Assemblyladevorgangs bereitzustellen. 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.
Hinweis
- 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 Laufzeit
Die Laufzeit implementiert zwei Assemblyladekontexte:
- AssemblyLoadContext.Defaultstellt den Standardkontext der Laufzeit dar, der für die Anwendung Standard Assembly und deren statische Abhängigkeiten verwendet wird.
- Die Assembly.LoadFile(String) Methode isoliert die geladenen Assemblys, indem die einfachste AssemblyLoadContextInstanziierung ausgeführt wird. Es verfügt über ein vereinfachtes Isolationsschema, das jede Assembly ohne Abhängigkeitsauflösung lädt AssemblyLoadContext .
Anwendungsnutzung
Eine Anwendung kann eine eigene AssemblyLoadContext Lösung erstellen, um eine benutzerdefinierte Lösung für erweiterte Szenarien zu erstellen. Die Anpassung konzentriert sich auf die Definition von Abhängigkeitsauflösungsmechanismen.
Dies AssemblyLoadContext bietet zwei Erweiterungspunkte zum Implementieren der verwalteten Assemblyauflösung:
- Die AssemblyLoadContext.Load(AssemblyName) Methode bietet die erste Möglichkeit, die AssemblyLoadContext Assembly aufzulösen, zu laden und zurückzugeben. Wenn die AssemblyLoadContext.Load(AssemblyName) Methode zurückgegeben wird
null
, versucht das Ladeprogramm, die Assembly in die AssemblyLoadContext.DefaultAssembly 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 Laufzeit löst das Resolving Ereignis aus.
Darüber hinaus ermöglicht die virtuelle Methode die AssemblyLoadContext.LoadUnmanagedDll(String) Anpassung der standardmäßigen nicht verwalteten Assemblyauflösung. 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.
Achtung
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.
Das Timing des Ladens der Assembly kann das Testen und Debuggen erschweren. Assemblys werden in der Regel geladen, ohne dass ihre Abhängigkeiten sofort aufgelöst werden. Die Abhängigkeiten werden bei Bedarf geladen:
- Wenn Code in eine abhängige Assembly verzweigt.
- Wenn Code Ressourcen lädt.
- Wenn Code Assemblys explizit lädt.
Die Implementierung kann AssemblyLoadContext.Load(AssemblyName) neue Abhängigkeiten hinzufügen, die möglicherweise isoliert sein müssen, damit unterschiedliche Versionen vorhanden sind. 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' umwandeln".
- Das Marshallen ü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.