Compartir a través de


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 ensamblados WinRT usan el mismo algoritmo.

¿Cuándo se cargan los ensamblados administrados?

El mecanismo más común para desencadenar una carga de ensamblado administrado es una referencia de ensamblado estático. El compilador inserta estas referencias cada vez que el código usa un tipo definido en otro ensamblado. Estos conjuntos se cargan (load-by-name) según sea necesario por el entorno de ejecución. No se especifica el tiempo exacto de cuándo 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 siguientes API también desencadenará cargas:

Interfaz de Programación de Aplicaciones (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 AssemblyLoadContext instancia.
Assembly.LoadFrom Cargue desde la ruta de acceso en la instancia de AssemblyLoadContext.Default.
Agrega un AppDomain.AssemblyResolve controlador. 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 AssemblyLoadContext instancia.
Type.GetType(String)
Type.GetType(String, Boolean)
Type.GetType(String, Boolean, Boolean)
Load-by-name. Se infiere del autor de la llamada.
Prefiera 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

En el algoritmo siguiente se describe cómo carga el tiempo de ejecución un ensamblado administrado.

  1. Determine el elemento active de AssemblyLoadContext.

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

  3. Para los otros tipos de cargas, carga activeAssemblyLoadContext 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 active de la instancia de AssemblyLoadContextcache-by-name.
  4. En cualquier caso, si se carga un ensamblado nuevo, entonces se genera el evento AppDomain.AssemblyLoad.