Algoritmo di caricamento dell'assembly gestito
Gli assembly gestiti vengono posizionati e caricati con un algoritmo che prevede varie fasi.
Tutti gli assembly gestiti, ad eccezione degli assembly satellite e degli assembly WinRT
, usano lo stesso algoritmo.
Quando vengono caricati gli assembly gestiti?
Il meccanismo più comune per attivare un carico di assembly gestito è un riferimento all'assembly statico. Questi riferimenti vengono inseriti dal compilatore ogni volta che il codice usa un tipo definito in un altro assembly. Questi assembly vengono caricati (load-by-name
) in base alle esigenze del runtime. L'intervallo esatto di quando vengono caricati i riferimenti all'assembly statico non è specificato. Può variare tra una versione e l’altra di runtime e dipende da ottimizzazioni come l'inlining.
Anche l'uso diretto delle API seguenti attiverà i caricamenti:
Algoritmo
L'algoritmo seguente descrive come il runtime carica un assembly gestito.
Determinare
active
AssemblyLoadContext.- Per un riferimento all'assembly statico,
active
AssemblyLoadContext è l'istanza che ha caricato l'assembly di riferimento. - Le API preferite rendono esplicito
active
AssemblyLoadContext. - Altre API deducono
active
AssemblyLoadContext. Per queste API, viene usata la proprietà AssemblyLoadContext.CurrentContextualReflectionContext. Se il valore ènull
, viene usata l'istanza dedotta AssemblyLoadContext. - Vedere la tabella nella sezione Quando vengono caricati assembly gestiti?.
- Per un riferimento all'assembly statico,
Per i metodi
Load-by-name
,active
AssemblyLoadContext carica l'assembly nell'ordine di priorità seguente:- Controllare il relativo
cache-by-name
. - Chiamare la funzione AssemblyLoadContext.Load.
- Controllare la cache dell'istanza di AssemblyLoadContext.Default ed eseguire la logica di verifica predefinita dell'assembly gestito. Se un assembly viene appena caricato, viene aggiunto un riferimento a
cache-by-name
dell'istanza AssemblyLoadContext.Default. - Generare l'evento AssemblyLoadContext.Resolving per AssemblyLoadContext attivo.
- Generare l'evento AppDomain.AssemblyResolve.
- Controllare il relativo
Per gli altri tipi di caricamento,
active
AssemblyLoadContext carica l'assembly nell'ordine di priorità seguente:- Controllare il relativo
cache-by-name
. - Caricare dal percorso specificato o dall'oggetto assembly non elaborato. Se viene caricato un nuovo assembly, si aggiunge un riferimento a
active
AssemblyLoadContextcache-by-name
dell'istanza.
- Controllare il relativo
In entrambi i casi, se un assembly viene appena caricato, viene generato l'evento AppDomain.AssemblyLoad.