Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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).
Zalecana akcja
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
- Wywołania funkcji używając P/Invoke
- System.Runtime.InteropServices.NativeLibrary.Load
- System.Runtime.InteropServices.NativeLibrary.TryLoad