Comparteix a través de


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.

  1. Comprueba que el nombre de la biblioteca que se proporciona representa una ruta de acceso relativa o absoluta.

  2. 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, .dyliby .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.

  3. 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.

  4. Indique que la biblioteca no se pudo cargar.