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.
Anteriormente, en aplicaciones .NET de un solo archivo, el directorio del archivo ejecutable de un solo archivo se agregó a la propiedad durante el NATIVE_DLL_SEARCH_DIRECTORIES arranque. Por lo tanto, .NET siempre sondeó el directorio de la aplicación cuando se cargaron bibliotecas no administradas. En sistemas que no sean Windows y usen NativeAOT, el directorio de la aplicación se estableció en rpath de forma predeterminada, de modo que también siempre se buscaban bibliotecas nativas en el directorio de la aplicación.
El directorio de la aplicación ya no se agrega a NATIVE_DLL_SEARCH_DIRECTORIES en aplicaciones de archivo único y la configuración rpath se ha quitado en NativeAOT. En ambos casos, DllImportSearchPath.AssemblyDirectory (incluido en el comportamiento predeterminado de P/Invokes) significa el directorio de la aplicación. Si especifica ese valor o deja el valor predeterminado, .NET busca en el directorio de la aplicación. Si especifica marcas sin ese valor, .NET ya no busca en el directorio de la aplicación.
Versión introducida
.NET 10
Comportamiento anterior
Anteriormente, las aplicaciones de archivo único siempre buscaban en el directorio de aplicaciones al cargar bibliotecas nativas. En sistemas operativos que no son Windows, las aplicaciones NativeAOT siempre buscaron en el directorio de aplicaciones al cargar bibliotecas nativas.
Por ejemplo, la siguiente P/Invoke buscó en el directorio de la aplicación y lo cargó desde allí si existía:
[DllImport("lib")
[DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
static extern void Method()
Nuevo comportamiento
A partir de .NET 10, las aplicaciones de un solo archivo solo buscarán en el directorio de la aplicación si las rutas de búsqueda para cargar una biblioteca nativa incluyen el directorio del ensamblado.
// Look in System32 on Windows.
// Search the OS on non-Windows.
[DllImport("lib")
[DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
static extern void Method()
// Look next to the single-file app because assembly directory
// means application directory for single-file apps.
[DllImport("lib")
[DefaultDllImportSearchPaths(DllImportSearchPath.AssemblyDirectory)]
static extern void Method()
// Look next to the single-file app (because assembly
// directory is searched by default), then default OS search.
[DllImport("lib")
static extern void Method()
Tipo de cambio disruptivo
Se trata de un cambio de comportamiento.
Motivo del cambio
El comportamiento existente (siempre se busca en el directorio de la aplicación aunque las rutas de búsqueda lo excluyan) ha provocado confusión. También es incoherente con la forma en que las marcas de búsqueda se manejan en aplicaciones .NET normales (no de un solo archivo, no NativeAOT).
Acción recomendada
Si se desea el directorio de aplicación o ensamblado para una carga de biblioteca P/Invoke o nativa y no se especificó anteriormente, especifique DllImportSearchPath.AssemblyDirectory.
Si la RPATH configuración es deseada en NativeAOT, agregue explícitamente los argumentos del enlazador correspondientes al proyecto.
Las APIs afectadas
- P/Invokes
- System.Runtime.InteropServices.NativeLibrary.Load
- System.Runtime.InteropServices.NativeLibrary.TryLoad