Freigeben über


Apps mit einer Datei suchen nicht mehr nach nativen Bibliotheken im ausführbaren Verzeichnis

Zuvor wurde bei Single-File .NET-Anwendungen das Verzeichnis der ausführbaren Einzeldatei bei Start der Anwendung zur NATIVE_DLL_SEARCH_DIRECTORIES Eigenschaft hinzugefügt. Folglich hat .NET immer das Anwendungsverzeichnis untersucht , wenn nicht verwaltete Bibliotheken geladen wurden. Bei Nicht-Windows mit NativeAOT wurde rpath standardmäßig auf das Anwendungsverzeichnis festgelegt, sodass immer auch nach nativen Bibliotheken im Anwendungsverzeichnis gesucht wird.

Das Anwendungsverzeichnis wird in Single-File-Apps nicht mehr hinzugefügt NATIVE_DLL_SEARCH_DIRECTORIES, und die rpath-Einstellung existiert in NativeAOT nicht mehr. In beiden Fällen DllImportSearchPath.AssemblyDirectory (im Standardverhalten für P/Invokes enthalten) bedeutet das Anwendungsverzeichnis. Wenn Sie diesen Wert angeben oder den Standardwert beibehalten, sucht .NET im Anwendungsverzeichnis. Wenn Sie Flags ohne diesen Wert angeben, sucht .NET nicht mehr im Anwendungsverzeichnis.

Eingeführt in Version

.NET 10

Vorheriges Verhalten

Bisher haben Einzeldateianwendungen immer im Anwendungsverzeichnis gesucht, wenn systemeigene Bibliotheken geladen werden. Auf Nicht-Windows-Betriebssystemen haben nativeAOT-Anwendungen beim Laden systemeigener Bibliotheken immer im Anwendungsverzeichnis gesucht.

Beispielsweise wurde der folgende P/Invoke im Anwendungsverzeichnis nach lib gesucht und von dort geladen, falls es existierte.

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

Neues Verhalten

Ab .NET 10 prüfen Einzeldatei-Anwendungen nur das Anwendungsverzeichnis, wenn die Suchpfade für das Laden einer systemeigenen Bibliothek das Einschließen des Assembly-Verzeichnisses vorsehen.

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

Art der einschneidenden Änderung

Dies ist eine Verhaltensänderung.

Grund für Änderung

Das vorhandene Verhalten (immer im Anwendungsverzeichnis suchen, auch wenn Suchpfade es ausschließen) hat Verwirrung verursacht. Es ist auch inkonsistent, wie die Such-Flags in regulären (nicht Single-File-, nicht NativeAOT-) .NET-Anwendungen behandelt werden.

Wenn das Anwendungs-/Assemblyverzeichnis für eine P/Invoke- oder Native-Bibliothek geladen werden soll und zuvor nicht angegeben wurde, spezifizieren Sie DllImportSearchPath.AssemblyDirectory.

Wenn die RPATH Einstellung in NativeAOT gewünscht wird, fügen Sie dem Projekt explizit die entsprechenden Linkerargumente hinzu.

Betroffene APIs

Siehe auch