5

.NET アセンブリを regasm.exe に登録すると、レジストリ キー

HKEY_CLASSES_ROOT\CLSID{111E32AD-4BF8-495F-AB4D-6C61BD463EA4}\InprocServer32

「mscoree.dll」に設定されています。

ただし、C で記述された既存の COM サーバーを模倣しようとしています。この古い COM サーバーを登録すると、InprocServer32 がこのコンポーネントへのフル パスに設定されます。

残念ながら、既存のシステム (私が変更できないプラグイン ホスト) は、この値を読み取って使用します。「mscoree.dll」の値と混同されています。

私の解決策は、このレジストリ エントリに手動でパッチを適用することかもしれませんが、regasm が "mscoree.dll" を InprocServer32 に書き込む理由を理解したいと思います。

4

1 に答える 1

7

説明はとても簡単です。ネイティブ (アンマネージ) COM サーバーをインプロセスで使用すると、それがコンシューマー プロセスに読み込まれ、コンシューマー プロセスがその関数を直接呼び出します。

これは、マネージ コードの COM 公開アセンブリではそれほど簡単には機能しません。マネージド コードの場合、マネージド/アンマネージド インタラクションを実行する中間層が必要です。mscoree.dllこの中間層として機能します。そのため、コンシューマー呼び出しCoCreateInstance() mscoree.dllが読み込まれ、COM に公開されたアセンブリ マネージ コードを読み込むことで COM サーバーをエミュレートし、すべての呼び出しを後者に転送します。

于 2010-05-31T05:39:41.200 に答える