Freigeben über


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

Verwendung in der Laufzeit

Die Laufzeit implementiert zwei Assemblyladekontexte:

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:

  1. 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.
  2. 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.