DllImport を使用した C# での DLL の動的ロード
C# の DllImport
属性は、ネイティブ DLL 関数との統合を簡素化します。 ただし、DLL の場所がシステム間で異なる可能性がある場合、定数文字列パスの要件が課題となります。 この記事では、実行時に DLL パスを動的に指定するためのソリューションについて説明します。
DllImport による相対パスの挑戦
次のように、DllImport
属性内で相対パスを直接使用します。
<code class="language-csharp">[DllImport("myLibFolder\myDLL.dll", CallingConvention = CallingConvention.Cdecl)] public static extern int DLLFunction(int Number1, int Number2);</code>
にはリテラル文字列が必要なため、DllImport
は失敗します。これにより、DLL の場所が変更される可能性があるため、展開時に問題が発生します。
推奨されるアプローチ: デフォルトの DLL 検索順序を利用する
最も効率的な解決策は、DLL を戦略的に配置し、Windows DLL の検索順序を利用することです。この順序では、次の場所が優先されます:
PATH
環境変数にリストされているディレクトリ。DLL をアプリケーションのディレクトリにインストールすると、実行時に確実に見つかるようになります。
代替: SetDllDirectory を使用した動的パス調整
デフォルトの検索順序では不十分な場合、SetDllDirectory
関数は動的な解決策を提供します。 この Win32 関数を使用すると、実行時に DLL 検索パスを変更できます。 P/Invoke 宣言は次のとおりです:
<code class="language-csharp">[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern bool SetDllDirectory(string lpPathName);</code>最初の DLL 関数呼び出しの
前SetDllDirectory
に を呼び出して、目的のディレクトリを検索パスに一時的に追加します。 これにより、さまざまな DLL の場所を処理する柔軟な方法が提供されます。
以上がC# で DllImport パスを動的に指定するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。