Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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
- AssemblyLoadContext biedt geen beveiligingsfuncties. Alle code heeft volledige machtigingen voor het proces.
- Alleen in .NET Core 2.0 - 2.2 AssemblyLoadContext is een abstracte klasse. Als u een concrete klasse in deze versies wilt maken, implementeert u de AssemblyLoadContext.Load(AssemblyName) methode.
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:
- 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
nullretourneert, probeert het laadprogramma de assembly in de AssemblyLoadContext.Default te laden. - 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.