Partilhar via


Os aplicativos de arquivo único não procuram mais bibliotecas nativas no diretório executável

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

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

Ver também