Delen via


Klasse System.Runtime.Loader.AssemblyLoadContext

Opmerking

In dit artikel vindt u aanvullende opmerkingen in de referentiedocumentatie voor deze API.

De AssemblyLoadContext vertegenwoordigt een laadcontext. Conceptueel maakt een belastingcontext een bereik voor het laden, oplossen en lossen van een set assembly's.

Het AssemblyLoadContext bestaat voornamelijk om isolatie van assemblage laden te bieden. Hiermee kunnen meerdere versies van dezelfde assembly binnen één proces worden geladen. Het vervangt de isolatiemechanismen die worden geleverd door meerdere AppDomain exemplaren in .NET Framework.

Opmerking

Gebruik in de runtime

De runtime implementeert twee assembly-belastingcontexten:

  • AssemblyLoadContext.Default vertegenwoordigt de standaardcontext van de runtime, die wordt gebruikt voor de hoofdassembly van de toepassing en de statische afhankelijkheden.
  • De Assembly.LoadFile(String) methode isoleert de assemblies die worden geladen door de eenvoudigste AssemblyLoadContext te instantiëren. Het heeft een simplistisch isolatieschema dat elke assembly in zijn eigen AssemblyLoadContext geheel laadt zonder afhankelijkheidsresolutie.

Toepassingsgebruik

Een toepassing kan een eigen AssemblyLoadContext toepassing maken om een aangepaste oplossing te maken voor geavanceerde scenario's. De aanpassing is gericht op het definiëren van mechanismen voor afhankelijkheidsoplossing.

De AssemblyLoadContext oplossing biedt twee uitbreidingspunten voor het implementeren van beheerde assembly-resolutie:

  1. De methode AssemblyLoadContext.Load(AssemblyName) biedt de eerste mogelijkheid voor AssemblyLoadContext om de assembly op te lossen, te laden en te retourneren. Als de AssemblyLoadContext.Load(AssemblyName) methode null retourneert, probeert het laadprogramma de assembly in de AssemblyLoadContext.Default te laden.
  2. Als de AssemblyLoadContext.Default de assembly niet kan oplossen, krijgt de oorspronkelijke AssemblyLoadContext een tweede kans om de assembly op te lossen. De runtime genereert de Resolving gebeurtenis.

Bovendien kan met de AssemblyLoadContext.LoadUnmanagedDll(String) virtuele methode de standaardoplossing voor niet-beheerde assembly's worden aangepast. De standaard implementatie retourneert null, waardoor de runtime-zoekopdracht het standaardzoekbeleid gebruikt. Het standaardzoekbeleid is voldoende voor de meeste scenario's.

Technische uitdagingen

  • Het is niet mogelijk om meerdere versies van de runtime in één proces te laden.

    Waarschuwing

    Het laden van meerdere kopieën of verschillende versies van frameworkassembly's kan leiden tot onverwacht en moeilijk te diagnosticeren gedrag.

    Aanbeveling

    Gebruik procesgrenzen met externe communicatie of interprocescommunicatie om dit isolatieprobleem op te lossen.

  • De timing van het laden van assembly's kan het testen en foutopsporing moeilijk maken. Assemblies worden doorgaans geladen zonder dat hun afhankelijkheden onmiddellijk worden opgelost. De afhankelijkheden worden geladen wanneer ze nodig zijn:

    • Wanneer code vertakt naar een afhankelijke assemblage.
    • Wanneer de code resources laadt.
    • Wanneer code expliciet assemblages laadt.
  • De implementatie van AssemblyLoadContext.Load(AssemblyName) kan nieuwe afhankelijkheden toevoegen die mogelijk moeten worden geïsoleerd om verschillende versies toe te staan. De meest natuurlijke implementatie plaatst deze afhankelijkheden in de standaardcontext. Zorgvuldig ontwerp kan de nieuwe afhankelijkheden isoleren.

  • Dezelfde assembly wordt meerdere keren in verschillende contexten geladen.

    • Dit kan leiden tot verwarrende foutberichten, bijvoorbeeld 'Kan het object van het type 'Sample.Plugin' niet casten naar type 'Sample.Plugin''.
    • Het verwerken van gegevens over isolatiebarrières is een complexe uitdaging. Een typische oplossing is het gebruik van een interface die is gedefinieerd in een assembly die alleen in de standaardbelastingscontext wordt geladen.