Appar med en fil letar inte längre efter interna bibliotek i den körbara katalogen

Tidigare, i .NET-program med en fil, lades katalogen för den körbara filen till i NATIVE_DLL_SEARCH_DIRECTORIES egenskapen under starten. Därför har .NET alltid avsökt programkatalogen när ohanterade bibliotek lästes in. I icke-Windows med NativeAOTrpath var den inställd på programkatalogen som standard, så att den också alltid letade efter interna bibliotek i programkatalogen.

Programkatalogen läggs inte längre till NATIVE_DLL_SEARCH_DIRECTORIES i appar med en fil och inställningen rpath har tagits bort i NativeAOT. I båda fallen DllImportSearchPath.AssemblyDirectory innebär (ingår i standardbeteendet för P/Invokes) programkatalogen. Om du anger det värdet eller lämnar standardvärdet letar .NET efter i programkatalogen. Om du anger flaggor utan det värdet ser .NET inte längre ut i programkatalogen.

Version lanserad

.NET 10

Tidigare beteende

Tidigare tittade enfilsprogram alltid i programkatalogen när de läste in inbyggda bibliotek. På icke-Windows-operativsystem tittade NativeAOT-program alltid i programkatalogen när interna bibliotek lästes in.

Följande P/Invoke tittade till exempel i programkatalogen efter lib och läste in det därifrån om det fanns:

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

Nytt beteende

Från och med .NET 10 tittar enfils-program bara i programkatalogen om sökvägarna för en inbyggd biblioteksinladdning indikerar att sammansättningskatalogen ingår.

// 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 av brytande ändring

Det här är en beteendeförändring.

Orsak till ändring

Det befintliga beteendet (leta alltid i programkatalogen även om sökvägar utesluter det) har orsakat förvirring. Det är också oförenligt med hur sökflaggor hanteras i vanliga .NET-program (inte en enda fil, icke-NativeAOT).

Om program-/sammansättningskatalogen är önskad för en P/Invoke- eller intern biblioteksbelastning och inte tidigare angavs anger du DllImportSearchPath.AssemblyDirectory.

Om inställningen RPATH önskas i NativeAOT lägger du uttryckligen till motsvarande länkargument i projektet.

Berörda API:er

Se även