1

ネイティブ C++ アプリケーションから作成された COM C# コンポーネントに関して質問があります。

C# コンポーネントは、COM インターフェイスを含むアセンブリを参照しています。したがって、プロジェクト A(.dll) には COM インターフェイスが含まれ、プロジェクト B(.dll) には、このインターフェイスを実装する COM クラスが含まれます。

この C# COM コンポーネントは、システム上のいくつかのフォルダーから regasm を使用して登録されます。

別のパスにインストールされているネイティブ C++ アプリケーション (COM サーバー) がプロジェクト B から C# COM クラスのインスタンスを作成しようとすると、A.dll が見つからないというエラー メッセージが表示されて失敗します。

A.dll (のみ) をネイティブ C++ アプリのインストール ディレクトリにコピーすると、すべてが完全に機能します。

指定されたディレクトリまたは B.dll が存在するディレクトリで A.dll を見つける必要があることをネイティブ C++ アプリに伝える方法についてのアイデアはありますか?

よろしく、 ドワイト

4

2 に答える 2

2

管理されていないサーバーであろうと、C# で記述されたサーバーであろうと、COM サーバーに依存関係があることは常に問題です。Windows と同様に、CLR は DLL のいくつかの選択された場所のみを検索します。GACとEXEが存在するディレクトリです。オプションで、app.exe.config ファイルを使用して EXE ディレクトリのサブディレクトリも検索できます。

ここで候補を打ちのめします。クライアント EXE に .config ファイルを与えることは避けたいでしょう。その場所や構成を制御することはできません。それは他の誰かのプログラムです。EXEディレクトリと同じ問題。

これはGACを去ります。

また、Regasm.exe が優先する場所です。アセンブリを GAC に配置した後に登録するときに、 /codebase オプションを省略してください。そして、COM に強く関連する DLL Hell 問題を解決するための非常に優れた方法として、GAC はさまざまなバージョンの DLL を格納できます。

于 2013-09-10T10:52:56.213 に答える
0

私の知る限り、あなたは B.dll しか登録していません。これが理由です。COM システムは、A.dll がどこにあるかを知りません。作業ディレクトリを変更するか、A.dll へのパスをシステム パス変数に追加するか、最後に A.dll を system32 ディレクトリにコピーする以外に、アプリケーションがどこにあるのかをアプリケーションに伝える方法がわかりません (でもそれは嫌いです)。ところで、A.dll のような DLL プロキシをアプリケーションと同じディレクトリに置くことは、私にはまったく問題ないように思えます。

あ、もう一つ。A.dll のパスがわかったが、上記の解決策のいずれも望まない場合は、Loadlibrary を調べることができます。

于 2013-09-10T09:08:14.747 に答える