編集:
中間 DLL が .Net アセンブリの場合、ここで説明するメソッドを使用して、既存のコードを変更することなく、中間 DLL を使用するメソッドを呼び出す前に、中間 DLL を探す場所を指定できます。
Main
メソッドが呼び出される前に .Net アセンブリが検出されて読み込まれるため、C# プロジェクトで DLL を直接参照しないでください。代わりに、AppDomain
またはその他の方法を使用して中間 DLL を動的にロードし、リフレクションまたはオブジェクトを使用してライブラリを使用する必要がありdynamic
ます。
どうやら、これはプログラミングを非常に面倒なものにするでしょう。ただし、別の方法があります。元のアプリケーションをロードし (.exe ファイルをライブラリとしてロードできます)、元のプログラムのメソッドを反射的に呼び出すランチャー プログラムを作成できます。Main
正しい中間 DLL がロードされていることを確認するには、ランチャー プログラムが元のアプリケーションをロードしている間に、ここに記載されている方法を使用できます。
次の説明は、ハードウェア DLL にも当てはまります。
次の場合は有効です。
- 一度に 1 つのバージョンの dll のみが必要です (アプリケーションが実行されている間)。
- 中間 DLL の 2 つのバージョンには、まったく同じ API があります。
MSDN によると、DLL 検索パスには、PATH 環境変数で指定されたディレクトリが含まれます。( http://msdn.microsoft.com/en-us/library/7d83bc18%28v=vs.80%29.aspx )。したがって、中間 DLL の 2 つのバージョンを、アプリケーション ディレクトリの下の別々のサブディレクトリに配置できますが、各ディレクトリの下にはまったく同じ名前を付けます。次に例を示します。
bin\
hardware-intermediate-v1\
intermediate.dll
hardware-intermediate-v2\
intermediate.dll
次に、起動時にアプリケーションが使用するバージョンを決定した後、上記のディレクトリのいずれかを PATH 環境変数に追加できます。
using System;
using System.Reflection;
using System.IO;
...
Environment.SetEnvironmentVariable(
"PATH",
Environment.GetEnvironmentVariable("PATH") + ";" +
Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) +
"\\hardware-intermediate-v1"
);
次に、P-Invoke メソッド (DLLImport) を呼び出すと、対応するバージョンの DLL が読み込まれます。すべての DLL をすぐにロードするには、DllImport を参照してください。DLL がロードされているかどうかを確認する方法は? .
ただし、アプリケーションを再起動せずに 2 つのバージョンの DLL を一緒に使用する場合、またはメソッド名および/またはパラメーターのカウント/タイプのレベルで 2 つの DLL 間に API の違いがある場合は、2 つの別個のセットを作成する必要があります。 P-Invoke メソッドのそれぞれが、対応するバージョンの中間 DLL にバインドされます。