Бөлісу құралы:


Однофайловые приложения больше не ищут собственные библиотеки в исполняемом каталоге

Ранее в однофайловых приложениях .NET каталог однофайловых исполняемых файлов был добавлен в NATIVE_DLL_SEARCH_DIRECTORIES свойство во время запуска. Следовательно, .NET всегда пробовал каталог приложений при загрузке неуправляемых библиотек. На операционных системах, отличных от Windows, с NativeAOT, параметр rpath был установлен в каталог приложения по умолчанию, таким образом, что он всегда искал собственные библиотеки в каталоге приложения.

Каталог приложений больше не добавляется в однофайловые NATIVE_DLL_SEARCH_DIRECTORIES приложения, а rpath параметр удален в NativeAOT. В обоих случаях DllImportSearchPath.AssemblyDirectory (включено в поведение по умолчанию для P/Invokes) означает каталог приложения. Если указать это значение или оставить значение по умолчанию, .NET выглядит в каталоге приложения. Если вы указываете флаги без этого значения, .NET больше не будет выглядеть в каталоге приложения.

Представленная версия

.NET 10

Предыдущее поведение

Ранее однофайловые приложения всегда искали в каталоге приложений при загрузке нативных библиотек. В операционных системах, отличных от Windows, приложения NativeAOT всегда искали в каталоге приложений при загрузке нативных библиотек.

Например, следующий P/Invoke искал в каталоге приложенияlib, и загружал его оттуда, если он существовал.

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

Новое поведение

Начиная с .NET 10, однофайловые приложения будут проверять только директорию приложения, если пути поиска для загрузки нативной библиотеки указывают на включение директории сборок.

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

Тип разрушающего изменения

Изменение поведения .

Причина изменения

Существующее поведение (всегда искать в каталоге приложений, даже если пути поиска исключают его), вызвало путаницу. Кроме того, он не согласуется с тем, как флаги поиска обрабатываются в обычных приложениях .NET (не однофайловых, отличных от NativeAOT).

Если каталог приложения или сборки необходим для загрузки P/Invoke или собственной библиотеки и не указан ранее, укажите DllImportSearchPath.AssemblyDirectory.

RPATH Если параметр требуется в NativeAOT, явно добавьте соответствующие аргументы компоновщика в проект.

Затронутые API

См. также