Condividi tramite


Classe System.Runtime.Loader.AssemblyLoadContext

Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.

Rappresenta AssemblyLoadContext un contesto di caricamento. Concettualmente, un contesto di carico crea un ambito per il caricamento, la risoluzione e lo scaricamento di un set di assembly.

Esiste AssemblyLoadContext principalmente per fornire l'isolamento del caricamento dell'assembly. Consente il caricamento di più versioni dello stesso assembly all'interno di un singolo processo. Sostituisce i meccanismi di isolamento forniti da più AppDomain istanze in .NET Framework.

Nota

Utilizzo nel runtime

Il runtime implementa due contesti di caricamento dell'assembly:

Utilizzo applicazioni

Un'applicazione può crearne una propria AssemblyLoadContext per creare una soluzione personalizzata per scenari avanzati. La personalizzazione è incentrata sulla definizione dei meccanismi di risoluzione delle dipendenze.

Fornisce AssemblyLoadContext due punti di estensione per implementare la risoluzione dell'assembly gestito:

  1. Il AssemblyLoadContext.Load(AssemblyName) metodo fornisce la prima possibilità per risolvere AssemblyLoadContext , caricare e restituire l'assembly. Se il AssemblyLoadContext.Load(AssemblyName) metodo restituisce null, il caricatore tenta di caricare l'assembly in AssemblyLoadContext.Default.
  2. Se l'oggetto AssemblyLoadContext.Default non è in grado di risolvere l'assembly, l'originale AssemblyLoadContext ottiene una seconda possibilità di risolvere l'assembly. Il runtime genera l'evento Resolving .

Inoltre, il AssemblyLoadContext.LoadUnmanagedDll(String) metodo virtuale consente la personalizzazione della risoluzione predefinita degli assembly non gestiti. L'implementazione predefinita restituisce null, che fa sì che la ricerca di runtime usi i criteri di ricerca predefiniti. I criteri di ricerca predefiniti sono sufficienti per la maggior parte degli scenari.

Sfide tecniche

  • Non è possibile caricare più versioni del runtime in un singolo processo.

    Attenzione

    Il caricamento di più copie o versioni diverse degli assembly del framework può causare un comportamento imprevisto e difficile da diagnosticare.

    Suggerimento

    Usare i limiti dei processi con comunicazione remota o interprocesso per risolvere questo problema di isolamento.

  • La tempistica del caricamento dell'assembly può rendere difficile il test e il debug. Gli assembly vengono in genere caricati senza che le relative dipendenze vengano risolte immediatamente. Le dipendenze vengono caricate in base alle esigenze:

    • Quando il codice si dirama in un assembly dipendente.
    • Quando il codice carica le risorse.
    • Quando il codice carica in modo esplicito gli assembly.
  • L'implementazione di AssemblyLoadContext.Load(AssemblyName) può aggiungere nuove dipendenze che possono essere isolate per consentire l'esistenza di versioni diverse. L'implementazione più naturale inserisce queste dipendenze nel contesto predefinito. Un'attenta progettazione può isolare le nuove dipendenze.

  • Lo stesso assembly viene caricato più volte in contesti diversi.

    • Ciò può causare messaggi di errore confusi, ad esempio "Impossibile eseguire il cast dell'oggetto di tipo "Sample.Plugin" per digitare "Sample.Plugin".
    • Il marshalling tra limiti di isolamento non è semplice. Una soluzione tipica consiste nell'usare un'interfaccia definita in un assembly caricato solo nel contesto di caricamento predefinito.