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:

API Descrizione Active AssemblyLoadContext
AssemblyLoadContext.LoadFromAssemblyName Load-by-name La presente istanza.
AssemblyLoadContext.LoadFromAssemblyPath
AssemblyLoadContext.LoadFromNativeImagePath
Caricare dal percorso. La presente istanza.
AssemblyLoadContext.LoadFromStream Caricare dall'oggetto. La presente istanza.
Assembly.LoadFile Caricare dal percorso in una nuova istanza AssemblyLoadContext Nuova istanza di AssemblyLoadContext.
Assembly.LoadFrom Caricare dal percorso nell'istanza AssemblyLoadContext.Default.
Aggiunge un gestore AppDomain.AssemblyResolve. 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.
Preferisce i metodi AssemblyLoadContext.
Assembly.Load(Byte[])
Assembly.Load(Byte[], Byte[])
Caricare dall'oggetto in una nuova istanza AssemblyLoadContext. Nuova istanza di AssemblyLoadContext.
Type.GetType(String)
Type.GetType(String, Boolean)
Type.GetType(String, Boolean, Boolean)
Load-by-name. Dedotto dal chiamante.
Preferisce i metodi Type.GetType con un argomento assemblyResolver.
Assembly.GetType Se il tipo name descrive un tipo generico qualificato di assembly, attivare un Load-by-name. Dedotto dal chiamante.
Preferire Type.GetType quando si usano 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 i metodi Activator.CreateInstance che accettano un argomento Type.

Algoritmo

L'algoritmo seguente descrive come il runtime carica un assembly gestito.

  1. Determinare l'oggetto activeAssemblyLoadContext.

  2. Per i metodi Load-by-name, activeAssemblyLoadContext carica l'assembly nell'ordine di priorità seguente:

  3. Per gli altri tipi di caricamento, il activeAssemblyLoadContext 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 un assembly viene appena caricato, viene aggiunto un riferimento a cache-by-name dell'istanza activeAssemblyLoadContext.
  4. In entrambi i casi, se un assembly viene appena caricato, viene generato l'evento AppDomain.AssemblyLoad.