Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 investigava o diretório do aplicativo quando as bibliotecas não gerenciadas eram carregadas. Em sistemas não-Windows com NativeAOT, rpath foi definido como o diretório do aplicativo por padrão, garantindo que também procure sempre bibliotecas nativas no diretório do aplicativo.
O diretório do aplicativo não é mais adicionado aos 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 examinará o diretório do aplicativo. Se você especificar sinalizadores sem esse valor, o .NET não examinará mais o diretório do aplicativo.
Versão introduzida
.NET 10
Comportamento anterior
Anteriormente, os aplicativos de arquivo único sempre olhavam no diretório do aplicativo ao carregar bibliotecas nativas. Em sistemas operacionais não Windows, os aplicativos NativeAOT sempre procuraram no diretório do aplicativo ao carregar bibliotecas nativas.
Por exemplo, o seguinte P/Invoke examinou o diretório do aplicativolib e o carregou de lá, se existisse.
[DllImport("lib")
[DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
static extern void Method()
Novo comportamento
A partir do .NET 10, os aplicativos de arquivo único procurarão apenas no diretório do aplicativo se os caminhos de pesquisa para o carregamento de uma biblioteca nativa incluírem o diretório do 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
Essa é uma mudança comportamental.
Motivo da alteração
O comportamento existente (sempre procure no diretório do aplicativo mesmo que os caminhos de pesquisa o excluam) causou confusão. Também é inconsistente com a forma como os flags de pesquisa são tratados em aplicativos .NET comuns (que não sejam de arquivo único e não usem NativeAOT).
Ação recomendada
Se o diretório de aplicativo/assembly for desejado para o carregamento de uma biblioteca P/Invoke ou nativa e ainda não tiver sido especificado, especifique DllImportSearchPath.AssemblyDirectory.
Se a RPATH configuração for desejada em NativeAOT, adicione explicitamente os argumentos correspondentes do vinculador ao seu projeto.
APIs afetadas
- P/Invocações
- System.Runtime.InteropServices.NativeLibrary.Load
- System.Runtime.InteropServices.NativeLibrary.TryLoad