Condividi tramite


Algoritmo per il caricamento gestito degli assembly

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.

  1. Determinare activeAssemblyLoadContext.

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

  3. Per gli altri tipi di carico, activeAssemblyLoadContext 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 activeAssemblyLoadContext di cache-by-name.
  4. In entrambi i casi, se un assembly viene nuovamente caricato, l'evento AppDomain.AssemblyLoad viene generato.