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.
Determine el elemento AssemblyLoadContext
active
.- En el caso de una referencia estática de ensamblado, el elemento AssemblyLoadContext
active
es la instancia que ha cargado el ensamblado de referencia. - Las API preferidas hacen que el elemento AssemblyLoadContext
active
sea explícito. - Otras API infieren el elemento AssemblyLoadContext
active
. Para estas API, se usa la propiedad AssemblyLoadContext.CurrentContextualReflectionContext. Si su valor esnull
, se usa la instancia de AssemblyLoadContext inferida. - Vea la tabla en la sección ¿Cuándo se cargan los ensamblados administrados?
- En el caso de una referencia estática de ensamblado, el elemento AssemblyLoadContext
Para los métodos
Load-by-name
,active
AssemblyLoadContext carga el ensamblado en el siguiente orden de prioridad:- Compruebe su elemento
cache-by-name
. - Llame a la función AssemblyLoadContext.Load.
- Compruebe la memoria caché de las instancias de AssemblyLoadContext.Default y ejecute la lógica sondeo predeterminado de ensamblado administrado. Si se ha cargado un ensamblado recientemente, se agrega una referencia al elemento
cache-by-name
de la instancia de AssemblyLoadContext.Default. - Genere el evento AssemblyLoadContext.Resolving para el elemento AssemblyLoadContext activo.
- Produce el evento AppDomain.AssemblyResolve.
- Compruebe su elemento
Para los otros tipos de cargas,
active
AssemblyLoadContext 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
cache-by-name
de la instanciaactive
de AssemblyLoadContext.
- Compruebe su elemento
En cualquier caso, si se carga un ensamblado recientemente, se genera el evento AppDomain.AssemblyLoad.