ホームページ >バックエンド開発 >C++ >C# で DllImport パスを動的に指定するにはどうすればよいですか?

C# で DllImport パスを動的に指定するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-15 20:29:44578ブラウズ

How Can I Specify a DllImport Path Dynamically in C#?

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 の検索順序を利用することです。この順序では、次の場所が優先されます:

  1. アプリケーションのディレクトリ
  2. システム ディレクトリ。
  3. 16 ビットのシステム ディレクトリ。
  4. Windows ディレクトリ。
  5. 現在のディレクトリ。
  6. 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。