Delen via


Apps met één bestand zoeken niet langer naar systeemeigen bibliotheken in uitvoerbare map

Voorheen werd in .NET-toepassingen met één bestand de map van het uitvoerbare bestand met één bestand toegevoegd aan de eigenschap tijdens het NATIVE_DLL_SEARCH_DIRECTORIES opstarten. Daarom heeft . NET altijd de toepassingsmap onderzocht toen niet-beheerde bibliotheken werden geladen. Bij niet-Windows-systemen wordt de standaard ingesteld op de toepassingsmap, zodat er altijd naar systeemeigen bibliotheken in de toepassingsmap wordt gezocht.

De toepassingsmap wordt niet meer toegevoegd aan NATIVE_DLL_SEARCH_DIRECTORIES apps met één bestand en de rpath instelling is verwijderd in NativeAOT. In beide gevallen betekent DllImportSearchPath.AssemblyDirectory (opgenomen in het standaardgedrag voor P/Invokes) de toepassingsmap. Als u die waarde opgeeft of de standaardwaarde laat staan, zoekt .NET in de toepassingsmap. Als u vlaggen opgeeft zonder die waarde, ziet .NET er niet meer uit in de toepassingsmap.

Geïntroduceerde versie

.NET 10

Vorig gedrag

Voorheen zochten toepassingen met één bestand altijd in de toepassingsmap bij het laden van systeemeigen bibliotheken. Op niet-Windows-besturingssystemen hebben NativeAOT-toepassingen altijd gezocht in de toepassingsmap bij het laden van systeemeigen bibliotheken.

De volgende P/Invoke zocht bijvoorbeeld in de toepassingsmap naar lib en laadde het daarvandaan als het bestond.

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

Nieuw gedrag

Vanaf .NET 10 zoeken toepassingen met één bestand alleen in de toepassingsmap als de zoekpaden voor het laden van een native bibliotheek aangeven dat de assemblymap moet worden opgenomen.

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

Type van brekende verandering

Dit is een gedragsverandering.

Reden voor wijziging

Het bestaande gedrag (altijd zoeken in de toepassingsmap, zelfs als zoekpaden dit uitsluiten) heeft verwarring veroorzaakt. Het is ook inconsistent met de manier waarop de zoekvlagmen worden verwerkt in gewone (niet-single-file, niet-NativeAOT) .NET-toepassingen.

Als de map voor applicatie/assembly nodig is voor een P/Invoke- of systeemeigen bibliotheekbelasting en niet eerder is opgegeven, geeft u DllImportSearchPath.AssemblyDirectory op.

Als de RPATH instelling gewenst is in NativeAOT, voegt u expliciet de bijbehorende linkerargumenten toe aan uw project.

Betreffende API's

Zie ook