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. |
Importante
A differenza di .NET Framework, il parametro assemblyFile di Assembly.LoadFrom è trattato come un percorso di file in .NET, anziché come URI. In .NET Framework, è possibile passare un URI di file (ad esempio file:///C:/path/to/assembly.dll), come uno costruito da Assembly.CodeBase, e l'assembly viene caricato correttamente. In .NET il assemblyFile valore viene passato a Path.GetFullPath, che non gestisce correttamente gli URI, quindi il caricamento non riesce. Se si dispone già di una stringa URI di file, creare prima di tutto un'istanza Uri e usare la relativa LocalPath proprietà per ottenere il percorso del file prima di chiamare Assembly.LoadFrom. Per ottenere il percorso del file di un assembly già caricato, usare Assembly.Location anziché CodeBase.
Algoritmo
L'algoritmo seguente descrive come il runtime carica un assembly gestito.
Determinare
activeAssemblyLoadContext.- Per un riferimento statico all'assembly,
activeAssemblyLoadContext è l'istanza che ha caricato l'assembly di riferimento. - Le API preferite rendono il
activeAssemblyLoadContext esplicito. - Altre API inferiscono
activeAssemblyLoadContext. 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'assemblyactiveAssemblyLoadContext 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,
activeAssemblyLoadContext carica l'assembly nell'ordine prioritario seguente:- Controlla il
cache-by-name. - Se il
activeAssemblyLoadContext è AssemblyLoadContext.Default, eseguire la logica di probe predefinita per gli assembly gestiti. - Caricare dal percorso specificato o dall'oggetto assembly non elaborato. Se un assembly viene appena caricato, viene aggiunto un riferimento all'istanza
activeAssemblyLoadContext dicache-by-name.
- Controlla il
In entrambi i casi, se un assembly viene nuovamente caricato, l'evento AppDomain.AssemblyLoad viene generato.