Sdílet prostřednictvím


Jednosouborové aplikace už nehledají nativní knihovny ve spustitelném adresáři.

Dříve se v aplikacích .NET s jedním souborem přidal do vlastnosti během spouštění adresář spustitelného souboru s jedním souborem NATIVE_DLL_SEARCH_DIRECTORIES . Proto .NET při načtení nespravovaných knihoven vždy vyhodnotil adresář aplikace. V jiných systémech než Windows s NativeAOTrpath byla ve výchozím nastavení nastavena na adresář aplikace, aby se v adresáři aplikace vždy hledaly nativní knihovny.

Adresář aplikace již není přidáván do NATIVE_DLL_SEARCH_DIRECTORIES u jednosouborových aplikací a nastavení rpath bylo v NativeAOT odstraněno. V obou případech ( DllImportSearchPath.AssemblyDirectory zahrnuté do výchozího chování P/Invokes) znamená adresář aplikace. Pokud tuto hodnotu zadáte nebo ponecháte výchozí hodnotu, bude .NET vypadat v adresáři aplikace. Pokud zadáte příznaky bez této hodnoty, rozhraní .NET už nebude v adresáři aplikace vypadat.

Verze byla představena

.NET 10

Předchozí chování

Dříve aplikace s jediným souborem při načítání nativních knihoven vždy hledaly v adresáři aplikace. V operačních systémech jiných než Windows se aplikace NativeAOT při načítání nativních knihoven vždy podívaly do adresáře aplikací.

Například následující volání nespravovaného kódu hledalo v adresářilib aplikace a načetlo ho odtud, pokud existovalo:

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

Nové chování

Od verze .NET 10 jednosouborové aplikace vyhledávají pouze v adresáři aplikace, pokud cesty pro nahrávání nativní knihovny označují zahrnutí adresáře sestavení.

// 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 zásadní změny

Jedná se o změnu chování.

Důvod změny

Stávající chování (vždy nahlíží do adresáře aplikace, i když jsou cesty hledání vyloučeny) způsobilo nejasnosti. Je také nekonzistentní s tím, jak jsou příznaky vyhledávání zpracovávány v běžných (ne jedno-souborových a ne NativeAOT) aplikacích .NET.

Pokud je pro načtení P/Invoke nebo nativní knihovny požadovaný adresář aplikace nebo sestavení a nebyl zadán dříve, zadejte DllImportSearchPath.AssemblyDirectory.

RPATH Pokud je nastavení požadované v NativeAOT, explicitně přidejte do projektu odpovídající argumenty linkeru.

Ovlivněná rozhraní API

Viz také