以前は、 単一ファイルの .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
- P/Invokes(プラットフォーム呼び出し)
- System.Runtime.InteropServices.NativeLibrary.Load
- System.Runtime.InteropServices.NativeLibrary.TryLoad
こちらも参照ください
.NET