Algoritmo de carga de ensamblado administrado

Los ensamblados administrados se ubican y se cargan con un algoritmo que tiene varias fases.

Todos los ensamblados administrados, excepto los ensamblados satélite y los de WinRT, usan el mismo algoritmo.

¿Cuándo se cargan los ensamblados administrados?

El mecanismo más común para desencadenar la carga de un ensamblado administrado es una referencia estática de ensamblado. El compilador inserta estas referencias siempre que el código usa un tipo definido en otro ensamblado. Estos ensamblados los carga (load-by-name) el runtime, según sea necesario. No se especifica el momento exacto en el que se cargan las referencias de ensamblado estático. Puede variar entre las distintas versiones del runtime se ve influenciada por optimizaciones como la inserción.

El uso directo de las API siguientes también desencadenará cargas:

API Descripción Active AssemblyLoadContext
AssemblyLoadContext.LoadFromAssemblyName Load-by-name La instancia de this.
AssemblyLoadContext.LoadFromAssemblyPath
AssemblyLoadContext.LoadFromNativeImagePath
Cargue desde la ruta de acceso. La instancia de this.
AssemblyLoadContext.LoadFromStream Cargue desde el objeto. La instancia de this.
Assembly.LoadFile Cargue desde la ruta de acceso en una nueva instancia de AssemblyLoadContext. La nueva instancia de AssemblyLoadContext.
Assembly.LoadFrom Cargue desde la ruta de acceso en la instancia de AssemblyLoadContext.Default.
Agrega un controlador de AppDomain.AssemblyResolve . El controlador cargará las dependencias del ensamblado desde su directorio.
Instancia de AssemblyLoadContext.Default.
Assembly.Load(AssemblyName)
Assembly.Load(String)
Assembly.LoadWithPartialName
Load-by-name. Se infiere del autor de la llamada.
Prefiere los métodos AssemblyLoadContext.
Assembly.Load(Byte[])
Assembly.Load(Byte[], Byte[])
Cargue desde el objeto en una nueva instancia de AssemblyLoadContext. La nueva instancia de AssemblyLoadContext.
Type.GetType(String)
Type.GetType(String, Boolean)
Type.GetType(String, Boolean, Boolean)
Load-by-name. Se infiere del autor de la llamada.
Prefiere los métodos Type.GetType con un argumento assemblyResolver.
Assembly.GetType Si el tipo name describe un tipo genérico calificado con el ensamblado, desencadene un elemento Load-by-name. Se infiere del autor de la llamada.
Prefiere Type.GetType al utilizar nombres de tipo calificados con el ensamblado.
Activator.CreateInstance(String, String)
Activator.CreateInstance(String, String, Object[])
Activator.CreateInstance(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[])
Load-by-name. Se infiere del autor de la llamada.
Prefiere los métodos Activator.CreateInstance que toman un argumento Type.

Algoritmo

El algoritmo siguiente describe cómo el runtime carga un ensamblado administrado.

  1. Determine el elemento AssemblyLoadContext de active.

  2. Para los métodos Load-by-name, activeAssemblyLoadContext carga el ensamblado en el siguiente orden de prioridad:

  3. Para los otros tipos de cargas, activeAssemblyLoadContext carga el ensamblado en el orden de prioridad siguiente:

    • Compruebe su elemento cache-by-name.
    • Cargue desde la ruta de acceso especificada o el objeto de ensamblado sin formato. Si se ha cargado un ensamblado recientemente, se agrega una referencia al elemento cache-by-name de la instancia de activeAssemblyLoadContext.
  4. En cualquier caso, si se carga un ensamblado recientemente, se genera el evento AppDomain.AssemblyLoad.