3

dll を実行可能ファイルと同じディレクトリにコピーせずに、登録不要の COM オブジェクトを使用するにはどうすればよいですか? これは可能ですか?

完全な作業サンプルまたは正確なシナリオの詳細なステップバイステップ ガイドが必要です。

たとえば、次のコンポーネントがあります。
CppTestRunner.exe - vc++ コンソール アプリケーション
CppTests.dll - vc++ mfc dll
CsCOMServer.dll - c# COM 可視 dll

外部マニフェストを追加するなど、exe またはそのディレクトリを変更したくありません。
CppTests.dll は、exe とは別のディレクトリにあります。
CsCOMServer.dll は CppTests.dll と同じディレクトリにあれば問題ありません。

CppTestRunner.exe は、正常に動作する CppTests.dll で LoadLibrary を呼び出します。

マニフェストを埋め込み、Windows アクティベーション コンテキスト API を使用した後、CsCOMServer.dll を exe ディレクトリにコピーして、CppTests.dll が CsCOMServer.dll のインスタンスを問題なく作成できることを確認できましたが、この手順を回避しようとしています。 .

現在、CppTests.dll と同じディレクトリに CsCOMServer.dll があり、exe ディレクトリに CsCOMServer.dll がない場合、CoCreateInstance を呼び出すと次のエラーが発生します。
エラー = 0x80070002 指定されたファイルが見つかりません。

sysinternals プロセス モニターを使用して、CppTestRunner.exe が検索するパスなどを追跡しました。
実行しようとしている操作によっては、CppTestRunner.exe が CppTests と同じディレクトリにある CsCOMServer.dll.config を読み取ろうとすることがあります。 dllに何を入れようとしても、エラーを乗り越えることができませんでした。
また、私がやろうとしている他のことにもよりますが、CppTestRunner.exe は CppTests.dll と同じディレクトリにある CsCOMServer.dll を読み込もうとしますが、何らかの理由で同じエラーが発生します。

この正確なシナリオで動作するコードを知っている人はいますか?

おそらくおわかりのように、これはいくつかのユニット\統合テストの一部です。

簡単な回避策として、現在 CppTestRunner.exe を CppTests.dll と同じディレクトリにコピーし、そこから実行していますが、この手順は避けたいと考えています。

ありがとうございました。

4

2 に答える 2

3

.NET は、管理された登録不要の COM を最初に GAC で検索し、次に実行可能ファイルのフォルダーで検索します。アクティベーション コンテキストを使用してアクティベーション メタデータを読み取りますが、ファイル自体の場所は特定しません。

于 2011-06-30T08:38:40.777 に答える
1

DLL をサブ フォルダー (たとえばDLLFolder\YourDll.dll ) に保存し、yourDll のマニフェスト ファイルに次のようなファイル名を書き込むことができます。

<file name = "DLLFolder\YourDll.dll">

ただし、EXE が保存されている場所に (DLL の) マニフェスト ファイルを保持する必要があります。

于 2012-05-23T12:49:59.140 に答える