Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.
Determine el elemento
activede AssemblyLoadContext.- Para una referencia de ensamblado estático,
activeAssemblyLoadContext es la instancia que cargó el ensamblado de referencia. - Las API preferidas hacen que
activeAssemblyLoadContext sea explícito. - Otras API deducen el
activeAssemblyLoadContext. Para estas API, se usa la AssemblyLoadContext.CurrentContextualReflectionContext propiedad . Si su valor esnull, se usa la instancia deducida AssemblyLoadContext . - Consulte la tabla en la sección ¿Cuándo se cargan los ensamblados administrados?
- Para una referencia de ensamblado estático,
Para los
Load-by-namemétodos,activeAssemblyLoadContext carga el ensamblado en el orden de prioridad siguiente:- Compruebe su elemento
cache-by-name. - Llame a la función AssemblyLoadContext.Load.
- Compruebe la caché de la instancia y ejecute la AssemblyLoadContext.Default lógica de sondeo predeterminada del ensamblado administrado . Si se ha cargado un ensamblado recientemente, se agrega una referencia al elemento AssemblyLoadContext.Default de la instancia de
cache-by-name. - Genere el evento AssemblyLoadContext.Resolving para el elemento AssemblyLoadContext activo.
- Produce el evento AppDomain.AssemblyResolve.
- Compruebe su elemento
Para los otros tipos de cargas, carga
activeAssemblyLoadContext el ensamblado en el orden de prioridad siguiente:- Compruebe su elemento
cache-by-name. - Si el
activeAssemblyLoadContext es AssemblyLoadContext.Default, ejecute la lógica de sondeo predeterminada para los ensamblados administrados. - 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
activede la instancia de AssemblyLoadContextcache-by-name.
- Compruebe su elemento
En cualquier caso, si se carga un ensamblado nuevo, entonces se genera el evento AppDomain.AssemblyLoad.