Sondeo predeterminado
La instancia de AssemblyLoadContext.Default se encarga de buscar las dependencias de un ensamblado. En este artículo se describe la lógica de sondeo de la instancia de AssemblyLoadContext.Default.
Propiedades de sondeo configuradas por host
Cuando se inicia el runtime, el host de tiempo de ejecución proporciona un conjunto de propiedades de sondeo con nombre que configuran las rutas de acceso de sondeo de AssemblyLoadContext.Default.
Cada propiedad de sondeo es opcional. Si está presente, cada propiedad es un valor de cadena que contiene una lista delimitada de rutas de acceso absolutas. El delimitador es ";" en Windows y ":" en el resto de plataformas.
Nombre de la propiedad | Descripción |
---|---|
TRUSTED_PLATFORM_ASSEMBLIES |
Lista de rutas de acceso de archivos de ensamblado de plataforma y aplicación. |
PLATFORM_RESOURCE_ROOTS |
Lista de rutas de acceso de directorio para buscar ensamblados de recursos satélite. |
NATIVE_DLL_SEARCH_DIRECTORIES |
Lista de rutas de acceso de directorio para buscar bibliotecas no administradas (nativas). |
APP_PATHS |
Lista de rutas de acceso de directorio para buscar bibliotecas administradas. |
¿Cómo se rellenan las propiedades?
Existen dos escenarios principales para rellenar las propiedades, en función de si existe el archivo <myapp>.deps.json.
- Cuando el archivo *.deps.json está presente, se analiza para rellenar las propiedades de sondeo.
- Cuando el archivo *.deps.json no está presente, se supone que el directorio de la aplicación contiene todas las dependencias. El contenido del directorio se usa para rellenar las propiedades de sondeo.
Además, los archivos *.deps.json para cualquier marco al que se hace referencia se analizan de forma parecida.
Se puede usar la variable de entorno DOTNET_ADDITIONAL_DEPS
para agregar dependencias adicionales. dotnet.exe
también contiene un parámetro --additional-deps
opcional para establecer este valor al iniciarse la aplicación.
La propiedad APP_PATHS
no se rellena de forma predeterminada y se omite en la mayoría de las aplicaciones.
Se puede tener acceso a la lista de todos los archivos *.deps.json usados por la aplicación a través de System.AppContext.GetData("APP_CONTEXT_DEPS_FILES")
.
Cómo ver las propiedades de sondeo desde un código administrado
Cada propiedad está disponible mediante una llamada a la función AppContext.GetData(String) con el nombre de la propiedad de la tabla anterior.
Cómo depurar la construcción de las propiedades de sondeo
El host de tiempo de ejecución de .NET Core generará mensajes de seguimiento útiles cuando se habiliten determinadas variables de entorno:
Variable de entorno | Descripción |
---|---|
COREHOST_TRACE=1 |
Habilita el seguimiento. |
COREHOST_TRACEFILE=<path> |
Realiza un seguimiento de una ruta de acceso de archivo en lugar del elemento stderr predeterminado. |
COREHOST_TRACE_VERBOSITY |
Establece el nivel de detalle de 1 (inferior) a 4 (superior). |
Sondeo predeterminado de ensamblado administrado
Al realizar un sondeo para buscar un ensamblado administrado, AssemblyLoadContext.Default busca en orden en:
- Archivos que coinciden con AssemblyName.Name en
TRUSTED_PLATFORM_ASSEMBLIES
(después de quitar extensiones de archivo). - Archivos de ensamblado en
APP_PATHS
con extensiones de archivo comunes.
Sondeo de ensamblado satélite (recurso)
Con el fin de buscar un ensamblado satélite para una referencia cultural concreta, construya un conjunto de rutas de acceso de archivos.
Para cada ruta de acceso de PLATFORM_RESOURCE_ROOTS
y, después, APP_PATHS
, anexe la cadena CultureInfo.Name, un separador de directorios, la cadena AssemblyName.Name y la extensión ".dll".
Si existe algún archivo coincidente, intente cargarlo y devolverlo.
Sondeo de biblioteca no administrada (nativa)
El algoritmo para sondear la biblioteca no administrada de runtime es idéntico en todas las plataformas. Sin embargo, dado que la plataforma subyacente hace la carga real de la biblioteca no administrada, el comportamiento puede variar ligeramente.
Comprueba que el nombre de la biblioteca que se proporciona representa una ruta de acceso relativa o absoluta.
Si el nombre representa una ruta de acceso absoluta, use directamente ese nombre para todas las operaciones posteriores. De otra forma, use el nombre y cree combinaciones definidas por la plataforma para que se tengan en cuenta. Las combinaciones se formar a partir de prefijos específicos de la plataforma (por ejemplo,
lib
) y/o sufijos (por ejemplo,.dll
,.dylib
y.so
). Esta no es una lista exhaustiva y no refleja toda la labor que se hace en cada plataforma. Es simplemente un ejemplo de lo que se tiene en cuenta. Para más información, consulte carga de bibliotecas nativas.El nombre y, en el caso de las rutas de acceso relativas, cada combinación, se usan después en los siguientes pasos. La primera vez que se completa la carga correctamente devuelve inmediatamente el manipulador a la biblioteca cargada.
Anéxelo a cada ruta de acceso proporcionada en la propiedad
NATIVE_DLL_SEARCH_DIRECTORIES
e intente cargarla.Si DefaultDllImportSearchPathsAttribute no está definido en el ensamblado de llamada o p/invoke o está definido e incluye
DllImportSearchPath.AssemblyDirectory
, anexe el nombre o la combinación al directorio del ensamblado que realiza la llamada e intente cargar.Úselo directamente para cargar la biblioteca.
Indique que la biblioteca no se pudo cargar.