Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Gli assembly gestiti sono localizzati e caricati seguendo un algoritmo che si articola in varie fasi.
Tutti gli assembly gestiti, ad eccezione degli assembly satellite e delle WinRT
assembly, usano lo stesso algoritmo.
Quando vengono caricati 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 moduli vengono caricati (load-by-name
) secondo le necessità del runtime. Il momento esatto in cui vengono caricati i riferimenti all'assembly statico non è specificato. Può variare tra le versioni di runtime e dipende da ottimizzazioni come l'inlining.
Anche l'uso diretto delle API seguenti attiverà i caricamenti:
API (Interfaccia di Programmazione delle Applicazioni) | Descrizione |
Active
AssemblyLoadContext
|
---|---|---|
AssemblyLoadContext.LoadFromAssemblyName | Load-by-name |
Questa istanza . |
AssemblyLoadContext.LoadFromAssemblyPath AssemblyLoadContext.LoadFromNativeImagePath |
Caricare dal percorso. | Questa istanza . |
AssemblyLoadContext.LoadFromStream | Caricamento dall'oggetto | Questa istanza . |
Assembly.LoadFile | Caricare dal percorso in una nuova AssemblyLoadContext istanza | Nuova AssemblyLoadContext istanza. |
Assembly.LoadFrom | Caricare dal percorso nell'istanza AssemblyLoadContext.Default. Aggiunge un AppDomain.AssemblyResolve gestore. Il gestore caricherà le dipendenze dell'assembly dalla relativa directory. |
Istanza AssemblyLoadContext.Default. |
Assembly.Load(AssemblyName) Assembly.Load(String) Assembly.LoadWithPartialName |
Load-by-name . |
Dedotto dal chiamante. Preferisci i metodi AssemblyLoadContext. |
Assembly.Load(Byte[]) Assembly.Load(Byte[], Byte[]) |
Caricare da un oggetto in una nuova istanza di AssemblyLoadContext. | Nuova AssemblyLoadContext istanza. |
Type.GetType(String) Type.GetType(String, Boolean) Type.GetType(String, Boolean, Boolean) |
Load-by-name . |
Dedotto dal chiamante. Preferisci Type.GetType i metodi con un assemblyResolver argomento. |
Assembly.GetType | Se il tipo name descrive un tipo generico qualificato con assembly, attivare un Load-by-name . |
Dedotto dal chiamante. Preferisci Type.GetType quando usi nomi di tipi qualificati dell'assembly. |
Activator.CreateInstance(String, String) Activator.CreateInstance(String, String, Object[]) Activator.CreateInstance(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[]) |
Load-by-name . |
Dedotto dal chiamante. Preferisce Activator.CreateInstance i metodi che accettano un Type argomento. |
Algoritmo
L'algoritmo seguente descrive come il runtime carica un assembly gestito.
Determinare
active
AssemblyLoadContext.- Per un riferimento statico all'assembly,
active
AssemblyLoadContext è l'istanza che ha caricato l'assembly di riferimento. - Le API preferite rendono il
active
AssemblyLoadContext esplicito. - Altre API inferiscono
active
AssemblyLoadContext. Per queste API, viene usata la AssemblyLoadContext.CurrentContextualReflectionContext proprietà . Se il valore ènull
, viene usata l'istanza dedotta AssemblyLoadContext . - Consulta la tabella nella sezione intitolata Quando vengono caricati assembly gestiti?
- Per un riferimento statico all'assembly,
Per i metodi
Load-by-name
, l'assemblyactive
AssemblyLoadContext viene caricato nel seguente ordine di priorità:- Controlla il
cache-by-name
. - Chiamare la funzione AssemblyLoadContext.Load.
- Controllare la cache dell'istanza AssemblyLoadContext.Default ed eseguire la logica di sondaggio predefinita dell'assembly gestito. Se un assembly viene appena caricato, viene aggiunto un riferimento all'istanza AssemblyLoadContext.Default di
cache-by-name
. - Generare l'evento AssemblyLoadContext.Resolving per l'AssemblyLoadContext attivo.
- Attivare l'evento AppDomain.AssemblyResolve.
- Controlla il
Per gli altri tipi di carico,
active
AssemblyLoadContext carica l'assembly nell'ordine prioritario seguente:- Controlla il
cache-by-name
. - Caricare dal percorso specificato o dall'oggetto assembly non elaborato. Se un assembly viene appena caricato, viene aggiunto un riferimento all'istanza
active
AssemblyLoadContext dicache-by-name
.
- Controlla il
In entrambi i casi, se un assembly viene nuovamente caricato, l'evento AppDomain.AssemblyLoad viene generato.