Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Anteriormente, em aplicativos .NET de arquivo único, o diretório do executável de arquivo único era adicionado à propriedade durante a NATIVE_DLL_SEARCH_DIRECTORIES inicialização. Consequentemente, o .NET sempre sondou o diretório do aplicativo quando bibliotecas não gerenciadas foram carregadas. Em não-Windows com NativeAOT, o rpath foi definido para o diretório do aplicativo por padrão, de modo que ele também sempre procurou bibliotecas nativas no diretório do aplicativo.
O diretório do aplicativo não é mais adicionado em NATIVE_DLL_SEARCH_DIRECTORIES aplicativos de arquivo único e a rpath configuração foi removida no NativeAOT. Em ambos os casos, DllImportSearchPath.AssemblyDirectory (incluído no comportamento padrão para P/Invokes) significa o diretório do aplicativo. Se você especificar esse valor ou deixar o padrão, o .NET procurará no diretório do aplicativo. Se você especificar sinalizadores sem esse valor, o .NET não procurará mais no diretório do aplicativo.
Versão introduzida
.NET 10
Comportamento anterior
Anteriormente, os aplicativos de arquivo único sempre procuravam no diretório de aplicativos ao carregar bibliotecas nativas. Em sistemas operacionais que não são Windows, os aplicativos NativeAOT sempre procuravam no diretório de aplicativos ao carregar bibliotecas nativas.
Por exemplo, o seguinte P/Invoke procurou no diretóriolib do aplicativo e carregou-o de lá, se existisse:
[DllImport("lib")
[DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
static extern void Method()
Novo comportamento
A partir do .NET 10, as aplicações de ficheiro único só procuram no diretório da aplicação se os caminhos de procura para uma biblioteca nativa a carregar indicarem que deve ser incluído o diretório da assembly.
// 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 mudança disruptiva
Trata-se de uma mudança de comportamento.
Motivo da mudança
O comportamento existente (sempre procurar no diretório do aplicativo, mesmo que os caminhos de pesquisa o excluam) causou confusão. Também é inconsistente com a forma como os sinalizadores de pesquisa são tratados em aplicações .NET convencionais (não de ficheiro único, nem NativeAOT).
Ação recomendada
Se o diretório application/assembly for desejado para uma carga de biblioteca P/Invoke ou nativa e não tiver sido especificado anteriormente, especifique DllImportSearchPath.AssemblyDirectory.
Se a RPATH configuração for desejada no NativeAOT, adicione explicitamente os argumentos do vinculador correspondentes ao seu projeto.
APIs afetadas
- P/Invoke
- System.Runtime.InteropServices.NativeLibrary.Load
- System.Runtime.InteropServices.NativeLibrary.TryLoad