0

DllImport を使用して C++ dll を参照する .net dll (instrument-proxy と呼ぶ) を参照するプロジェクト (プラットフォームと呼ぶ) があります (instrument と呼びます)。機器とそのプロキシは常に同じバージョンであり、常に 1 つとして展開されます。

1 台のマシンに (プロキシを使用して) 複数の計測器をデプロイできるようにする必要があり、特定のバージョンの計測器を使用するプラットフォームは 1 つだけです。

C++ DLL を使用しているため、GAC に insturent-proxy を配置できないようです。特定のフォルダにインストルメント (およびプロキシ) をインストールできますが、プラットフォームがその dll を確実に検出できるようにするにはどうすればよいですか?

更新。

理論的には、開発中にこの dll を通常どおりに参照することですが、アプリケーションでカスタム フォルダー内のこの dll を検索できるようにすることです。

4

4 に答える 4

2

それらを別々のフォルダーに保管しても問題ありません。を使用して、適切なインストルメント プロキシ アセンブリを自分でロードしますAssembly.LoadFrom。次に、リフレクションを使用してそのアセンブリからクラスのインスタンスを作成し、呼び出しを行います。

Assembly assm = Assembly.LoadFrom("c:\\Versions\\Version01\\instrument-proxy.dll");
Type yourClassType = assm.GetType("YourClass");
object yourClassObj = Activator.CreateInstance(yourClassType);
object Result = yourClassType.InvokeMember("DoSomething",
                                            BindingFlags.Default | BindingFlags.InvokeMethod,
                                            null,
                                            yourClassObj,
                                            args);

リフレクション呼び出しを回避するInvokeMemberには、インターフェースで試すことができます:

Assembly assm = Assembly.LoadFrom("c:\\Versions\\Version01\\instrument-proxy.dll");
Type yourClassType = assm.GetType("YourClass");
YourInterface interf = (YourInterface)Activator.CreateInstance(yourClassType);
interf.DoSomething();

インターフェイスは、あなたから参照できる別のアセンブリにある必要がありますplatform。すべてinstrument-proxiesを同じバージョンのインターフェイス アセンブリに対してコンパイルする必要があります。

インストゥルメント プロキシが管理されていないものを見つけられないInstrument.dll場合は、最初に使用する前に明示的にロードできます。

[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string dllToLoad);

IntPtr pDll = LoadLibrary(@"PathTo_Instrument.dll");

完了したら、解放/アンロードします。

[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr hModule);
于 2012-04-12T09:13:24.587 に答える
1

管理されていない dll ファイルをフォルダーにコピーしてから、そのフォルダーをシステム パス変数に追加するか、これらのファイルを Windows\System32 にコピーできます。このフォルダーは常にシステム パスにあるためです。

システム パスを変更するには、マイ コンピューターを右クリック -> [プロパティ] -> [システムの詳細設定] -> [詳細] タブ -> [環境変数] で、パス変数を見つけて、ファイルを含めるように変更する必要があります。

ただし、ファイルを Windows\System32 または %systemroot% (通常は C:\Windows) にコピーする方が簡単ですが、パス変数を変更する方法を使用することをお勧めします

于 2012-04-12T09:09:22.853 に答える
1

.Net アセンブリの場合、AppDomain.AssemblyResolveにサブスクライブし、必要に応じて Assembly.LoadFrom を使用してアセンブリを読み込むことができます ( https://stackoverflow.com/a/10120664/143503を参照)。

于 2012-04-12T10:11:16.053 に答える
0

Maceij が上記で提案したように、インストゥルメントを別のフォルダーにデプロイします。ただし、リフレクションを使用してインストゥルメントをロード/インスタンス化する代わりに、MEF を見てください。

あなたの正確なニーズには、これを行う別の方法が必要になる場合があり[Export]ますが、次の方法を使用して、instrument-proxy を IInstrument ファクトリ インターフェイスにします。

IInstrument GetInstrument( string name, int major, int minor );

次に、MEF に計測器の場所を伝え、必要な計測器を要求できるさまざまなファクトリを作成します。

MEF の MSDN: http://msdn.microsoft.com/en-us/library/dd460648.aspx

于 2012-04-12T09:59:52.110 に答える