Udostępnij przez


Aplikacje z jednym plikiem nie szukają już bibliotek natywnych w katalogu wykonywalnym

Wcześniej w aplikacjach .NET z jednym plikiem katalog pliku wykonywalnego z jednym plikiem został dodany do właściwości podczas uruchamiania NATIVE_DLL_SEARCH_DIRECTORIES . W związku z tym platforma .NET zawsze sondowała katalog aplikacji po załadowaniu niezarządzanych bibliotek. W środowiskach innych niż Windows z NativeAOT, rpath domyślnie został ustawiony jako katalog aplikacji, dzięki temu zawsze wyszukiwał biblioteki natywne w katalogu aplikacji.

Katalog aplikacji nie jest już dodawany do NATIVE_DLL_SEARCH_DIRECTORIES w aplikacjach z pojedynczym plikiem, a rpath ustawienie zostało usunięte w NativeAOT. W obu przypadkach DllImportSearchPath.AssemblyDirectory (uwzględnione w domyślnym zachowaniu dla P/Invokes) oznacza katalog aplikacji. Jeśli określisz tę wartość lub pozostawisz domyślną, program .NET będzie szukał w katalogu aplikacji. Jeśli określisz flagi bez tej wartości, platforma .NET nie będzie już wyglądać w katalogu aplikacji.

Wersja wprowadzona

.NET 10

Poprzednie zachowanie

Wcześniej aplikacje jednoplikowe zawsze przeszukiwały katalog aplikacji podczas ładowania bibliotek natywnych. W systemach operacyjnych innych niż Windows, aplikacje NativeAOT zawsze sprawdzały katalog aplikacji podczas ładowania bibliotek natywnych.

Na przykład następujący kod P/Invoke zajrzał do katalogulib aplikacji i załadował go stamtąd, jeśli istnieje:

[DllImport("lib")
[DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
static extern void Method()

Nowe zachowanie

Począwszy od platformy .NET 10, aplikacje jednoplikowe przeszukują tylko katalog aplikacji, jeśli ścieżki wyszukiwania do załadowania biblioteki natywnej wskazują na uwzględnienie katalogu dla zestawu.

// 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()

Typ zmiany przełamującej

Jest to zmiana zachowania.

Przyczyna zmiany

Istniejące zachowanie (zawsze należy szukać w katalogu aplikacji, nawet jeśli ścieżki wyszukiwania je wykluczają) spowodowało zamieszanie. Jest to również niespójne ze sposobem obsługi flag wyszukiwania w standardowych aplikacjach .NET (niebędących aplikacjami jednoplikowymi ani NativeAOT).

Jeśli katalog aplikacji/zestawu jest wymagany dla ładowania P/Invoke lub biblioteki natywnej i nie został wcześniej określony, określ wartość DllImportSearchPath.AssemblyDirectory.

RPATH Jeśli ustawienie jest pożądane w przypadku NativeAOT, należy jawnie dodać odpowiednie argumenty konsolidatora do projektu.

Interfejsy API, których dotyczy problem

Zobacz także