2016-04-26 13 views
1

私はC++ MFCプロジェクトに、.Netサードパーティ(.dll)と呼ばれる基本的にラッパーである.Net DLL(B.dllという名前)を参照しようとしています。私はB.dll用のtlbファイルを作成し、MFCアプリケーション内でこれをインスタンス化して呼び出すことができました。MFCマネージコードリファレンス

現在のところ、B.tlb、B.dll、およびC.dllのすべての依存関係は、MFCアプリケーションのbin フォルダにある必要があります。私が欲しいのは、苦労している、これら3つのファイルをMFC実行フォルダのサブフォルダに入れることです。

私は、B.dll設定ファイルの "privatePath"をサブフォルダに設定しようとしましたが、理解したように、設定する必要があるB.dllの "privatepath"ではなく、MFCアプリケーション(明らかにhasn私の知る限りでは、.Netアプリケーションではないので)

何か助けていただければ幸いです。

+1

から解決策を持っている、と多くのポイント決してありません。 CLRは、somename.exeと同じディレクトリにあるsomename.exe.configファイルを探します。したがって、 ''要素を追加すると、C.dllファイルを見つけるのに役立ちます。 B.dllは、Regasm.exeコマンドの/ codebaseオプションを使用してアセンブリを登録するか、mfcアプリケーションにマニフェストに ''要素を付ける必要があります。 COMの依存関係のためにユーザーのマシン上でGACを使用することは決して悪い考えではありません。 –

+0

なぜこのシナリオはDLL地獄と見なされますか?あなたはもっとそれを説明できますか? .Net dllラッパーを作成せずにCOMコンポーネントとして登録することはできません。 – ali

答えて

0

あなたはCOMを使用する必要はありません(必要な場合は私の答えは不完全です)。

ネイティブインターフェイスをエクスポートした独自のC++/CLIラッパーDLLを作成できます。あなたはこのネイティブラッパーを呼び出すことができます。このラッパーは.Netコンポーネントを直接ロードし、その中のコードを実行します。

このラッパーDLLでは、独自の検索を実装するResolveEventHandlerを追加することができます(おそらくサブディレクトリにあります)。これをあなたのCurrentDomain-> AssemblyResolveに追加してください

このトリックでは、このCOMのものをすべて取り除くことができます。そして、ロードすることができないアセンブリを探す必要があります。

は、私はあなたが確かにこのシナリオでは、DLL地獄を最大化しているhere