2017-06-28 3 views
0

私はdll COMコンポーネントとしてビルドし、installshieldLEを使用してインストールするWPFアプリケーションを用意していますが、COMクライアントを実行するといくつかの依存DLLでいくつか問題があります。COMアプリケーションはdllを参照してDLLを参照しています

私のWPF dllは、同じVS2012ソリューション内に存在する2つの他のC#dll(A & B)を参照しています。

私のWPF dllには、COM相互運用オプションのチェックボックスがチェックされており、WPF GUIアプリケーションを実行するためのCOMインターフェイスが用意されています。

私はWPFアプリケーションをテストするC COMクライアントプログラムを持っています。私が抱えている問題は、アプリケーションが正常に動作するためには、クライアントプログラムのフォルダにdll_Aの参照されているdll(サードパーティのグラフィックパッケージ)の一部を含める必要があることです。ローカルのクライアントディレクトリにdll_Aまたはdll_Bを含める必要はありません。

また、COMサーバーdllによって参照され、クライアントディレクトリに存在する必要がないインストールに含まれる他の(C)dllがあるため、これは理解しにくいものです。

これはWPFの質問ではなく、他の参照されているアセンブリに関連するcomサーバーのインストールに関する質問です。

メインのDLLに、&bのdllとメインのCOM DLLがインストール先から実行されていることを確認するデバッグメッセージが出力されました。しかし、サードパーティのDLLがローカルのクライアントフォルダにないときには、さらに例外が発生します。

この問題のトラブルシューティングをお手伝いできますか。インストール場所からクライアントプログラムを正常に実行できるので、必要なアセンブリとDLLがすべて存在することが確実です。

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

答えて

0

この問題は、参照されているDLLのうちの1つが.Net 4.0を使用してコンパイルされているために発生しましたが、他のDLLは.Net 4.0クライアントを使用してコンパイルされています。 .Net 4.0クライアントで再コンパイルすると問題が解決しました。

この問題は、登録されたcomコンポーネントとしてアプリケーションを実行するときに発生したようで、クライアントは別の場所から実行されていました。問題のDLLがクライアントディレクトリにコピーされた場合、すべて正常に動作します。

0

DLLロードパスに関連する問題が発生しているようです。クライアントアプリケーションはCOM DLLを読み込むことができますが、COM DLLと同じフォルダに依存関係が存在する場合でも、COM DLLは独自の依存関係(依存関係などの依存関係)を読み込むことができません。これは正しいです?

もしそうなら、この問題はAddDllDirectory関数の呼び出しで解決できると思います。あなたのCOM DLLに依存関係をロードする前にこの関数を呼び出して、完了したらRemoveDllDirectoryを呼び出してください。詳細については、LoadLibraryのドキュメントの「備考」セクションを参照してください。

+0

はい、正しいです。私はSetDllDirectory関数を調べます。あなたのご意見ありがとうございます。 – user5265160

+0

@ user5265160:AddDllDirectory/RemoveDllDirectoryはSetDllDirectoryより優れています。回答が更新されました。 –

+0

フィードバックいただきありがとうございます。これは知るのに便利です。私の問題はCOM/.Netに関連していました。依存するdllの1つは.Net 4.0を使用してコンパイルされましたが、その他は.Net 4.0クライアント版を使用してコンパイルされていました。これは、依存するdllがCOMクライアントと同じディレクトリにあるが、COMサーバーdllに入っているときはそうではないようです。 – user5265160

関連する問題