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.

Importante

A diferencia de .NET Framework, el parámetro assemblyFile de Assembly.LoadFrom se trata como una ruta de archivo en .NET, no como un URI. En .NET Framework, puede pasar un URI de archivo (por ejemplo, file:///C:/path/to/assembly.dll) (como uno construido a partir de Assembly.CodeBase) y el ensamblado se carga correctamente. En .NET, el assemblyFile valor se pasa a Path.GetFullPath, que no controla correctamente los URI, por lo que se produce un error en la carga. Si ya tiene una cadena de URI de archivo, cree primero una Uri instancia y use su LocalPath propiedad para obtener la ruta de acceso del archivo antes de llamar a Assembly.LoadFrom. Para obtener la ruta de acceso del archivo de un ensamblado ya cargado, use Assembly.Location en lugar de CodeBase.

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:

  4. En cualquier caso, si se carga un ensamblado nuevo, entonces se genera el evento AppDomain.AssemblyLoad.