次の方法で共有


単一ファイル アプリで実行可能ディレクトリ内のネイティブ ライブラリが検索されなくなりました

以前は、 単一ファイルの .NET アプリケーションでは、単一ファイル実行可能ファイルのディレクトリが起動時に NATIVE_DLL_SEARCH_DIRECTORIES プロパティに追加されていました。 その結果、アンマネージ ライブラリが読み込まれると、.NET は常にアプリケーション ディレクトリを プローブ しました。 NativeAOT を使用する Windows 以外では、rpathは既定でアプリケーション ディレクトリに設定され、アプリケーション ディレクトリ内のネイティブ ライブラリも常に検索されます。

アプリケーション ディレクトリが単一ファイル アプリの NATIVE_DLL_SEARCH_DIRECTORIES に追加されなくなり、NativeAOT で rpath 設定が削除されました。 どちらの場合も、 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()

破壊的変更の種類

これは動作の 変化です。

変更の理由

既存の動作 (検索パスで除外されている場合でも常にアプリケーション ディレクトリを参照) によって混乱が発生しました。 また、通常の (単一ファイル以外の NativeAOT 以外の) .NET アプリケーションで検索フラグを処理する方法と矛盾しています。

P/Invoke またはネイティブ ライブラリの読み込みにアプリケーション/アセンブリ ディレクトリが必要であり、以前に指定されていない場合は、 DllImportSearchPath.AssemblyDirectoryを指定します。

NativeAOT で RPATH 設定が必要な場合は、対応する リンカー引数 をプロジェクトに明示的に追加します。

影響を受ける API

こちらも参照ください