実行可能ファイルと同じディレクトリにdllをコピーせずに登録不要のCOM
-
29-10-2019 - |
質問
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.dllと同じディレクトリにあるCsCOMServer.dll.configを読み取ろうとすることがありますが、そこに何を入れようとしても、取得できませんでした。エラーを過ぎました。
また、他の方法にもよりますが、CppTestRunner.exeはCppTests.dllと同じディレクトリにあるCsCOMServer.dllを読み取ろうとしますが、何らかの理由で同じエラーが発生します。
この正確なシナリオでコードが機能することを知っている人はいますか?
おそらくおわかりのように、これはいくつかのユニット\統合テストの一部です。
簡単な回避策として、現在CppTestRunner.exeをCppTests.dllと同じディレクトリにコピーして実行していますが、この手順は避けたいと思います。
ありがとうございます。
解決
.NETは、最初にGACで、次に実行可能ファイルのフォルダーで、管理された登録不要のCOMを探します。アクティベーションコンテキストを使用してアクティベーションメタデータを読み取りますが、ファイル自体の場所を特定することはありません。
他のヒント
DLLをサブフォルダ( DLLFolder \ YourDll.dll など)に保存し、yourDllのマニフェストファイルにのようにファイル名を書き込むことができます。 ジェネラコディセタグプレ
ただし、EXEが保存されている場所に(DLLの)マニフェストファイルを保持する必要があります。