1

Interop DLLRCW.Xyz.dllがありますが、対応する DLL が見つかりません。名前は既定の命名規則に従っていないためInterop.Xyz.dll、相互運用アセンブリの名前が変更されただけだと思います。(DLL がデフォルト名で Visual Studio によって生成された場合でも、DLL の名前にスペースが含まれていると、スペースが失われ、ソース DLL を再度見つけるのが難しくなります)

相互運用アセンブリの背後にある COM DLL 名を調べるにはどうすればよいですか?

分解ツールを使用する必要があると思います。Reflector ライセンスを所有していないため、 dotPeekで機能するソリューションを探しています。

4

2 に答える 2

0

COM 相互運用では、1 つの COM ライブラリに対して 1 つの相互運用ライブラリが作成されるとは限りません。これは、タイプ ライブラリ インポーターの既定の動作にすぎません。複数の COM ライブラリに対して 1 つの相互運用アセンブリを提供することも、1 つの COM ライブラリに対して複数の相互運用アセンブリを提供することもできます。

相互運用アセンブリは、COM ライブラリにリンクされていません! ソース ライブラリをターゲット システムにインストールしなくても、簡単に展開できます。実際、ライブラリ オブジェクトの 1 つのインスタンスを作成しようとすると、すぐに失敗します。相互運用アセンブリ内のオブジェクトは、そのソースを見つけたい場合に重要です。これらは、Runtime Callable Wrapperと呼ばれます (Runtime は CLR の略です)。これが、相互運用アセンブリが呼び出される理由RCW.Xyz.dllです。おそらく、アセンブリの開発者は、tlbimp の/outスイッチを使用してアセンブリを作成しました。

ライブラリを検索する場合、特定の COM タイプが定義されている場合は、interop アセンブリ内でクラス名を検索するだけです。これを行うには、Visual Studio のオブジェクト エクスプローラーを使用できます。相互運用アセンブリを逆アセンブルする必要はありません。これらのアセンブリは通常、コードをまったく定義しません。CLR を満たすメタデータのみを提供します。各クラスは、ComImport属性と属性でマークされGuidます。この GUID を使用して、レジストリ内のクラスを識別します (HKEY_CLASSES_ROOT\CLSID\{GUID}回答で述べたように)。キーのInproc32デフォルト値は、型が定義されているライブラリです。これは、インプロセス COM サーバー (DLL; COM は他のライブラリ型をサポートします) にのみ適用されることに注意してください。

前述のように、これは実際にはクラスごとに行う必要があります。ただし、相互運用アセンブリの開発者がタイプ ライブラリ インポーターを使用して相互運用アセンブリを生成し、それを変更したり他のアセンブリとマージしたりしなかった場合は、前述の tlbimp の既定の動作により、1 つの型に対してのみ行うだけで十分です。

于 2014-02-15T11:38:03.670 に答える