2016-09-07 6 views
0

"クラスライブラリ" C#プロジェクトを作成し、VB6を使用して作成したカスタムCOM DLLへの参照を追加すると、Visual Studio 2015ではVSも自動的にすべての(?)COMを追加しますVB6 DLLはに依存しています。ネストされたCOM参照のインポート

これはどうしますか?どのようにこれらの参照が静的に把握できますか?

注 - VB6 DLLは「初期バインディング」を使用していますが、伝統的な「C」スタイルのDLLのように、COMアイテムのインポートテーブルと同等のものはありません。

答えて

0

実際にはすべての依存関係を静的に分析しているとは思われません。

私は、DLLのパブリックAPIの一部であるCOMリファレンスを追加するだけだと思います。これらは、私が理解する限り、DLLの一部であるtypelibで明白に見えます。

おそらく、内部では使用されているが、パブリックインターフェイスでは使用されていない他の依存関係は無視されます。

6

タイプライブラリへの参照を実際に追加しています。 DLLの内部にリソースとして埋め込まれています。 「ファイル」>「開く」>「ファイル」を使用してDLLを選択し、TYPELIBノードを開いたときに表示されます。 .NETアセンブリのメタデータとまったく同じ役割を果たし、公開されたインターフェイスとクラスの型定義をリストします。バイナリ形式ですが、OleView.exeユーティリティで逆コンパイルできます。

依存関係の情報もありますので、このような依存型ライブラリ(HKLM \ Software \ Wow6432Node \ Classes \ Typelibキー)の検索に役立ちます。 GACが.NETで果たす役割とほぼ同じです。 COMは誰もが想定しているように、.NETとまったく同じではありません:)最初のバージョンのCLRは、MicrosoftのCOM +グループによって作成されました。 COMに関連する登録とDLLの地獄の問題を解消することは、TODOリストのトップにありました。

タイプライブラリはまったく古いものではなく、まったく新しいWinRT(別名UWP、現代のUI)で重要な役割を果たします。それはCOMベースの、非常によく隠されたコアです。しかし、古い形式は制限のために廃止され、.winmd形式に置き換えられました。これは、.NETメタデータ形式とまったく同じです。どの.NETデコンパイラでもコンテンツを表示できます。

+0

*依存関係の情報もありますので、このような依存型ライブラリ(HKLM \ Software \ Wow6432Node \ Classes \ Typelibキー)を見つけるのに役立ちます* - この依存関係情報はどこですか? – acelent

+0

タイプライブラリにあります。 Oleview.exeを使用して、importlib()ステートメントを参照してください。 –

+0

ええ、TLBは本当にインポートされたライブラリを参照しているようです。ただし、tlbimp.exe&co。 'ITypeLib'から利用可能なデータをたどるだけで、ITypeInfo(継承、メソッドの引数、メソッドの戻り値の型、フィールドの型など)を含むインタフェース、構造体などの' ITypeInfo'を返します。基本的には 'ITypeInfo :: GetContainingTypeLib'を介して他の型ライブラリに含まれています。 – acelent

1

Visual Studioタイプライブラリインポータがタイプライブラリの依存関係を追いかける理由は、.NETにマップする型情報を収集するためです。

タイプライブラリには、直接の依存関係の情報はありません。だからこれは非常に良い質問です:型ライブラリの依存関係をどのように追跡するのですか?

唯一実現可能型ライブラリ依存性を検出する方法は、宣言型ライブラリを記述する型を参照することです。

たとえば、タイプライブラリでメソッドの署名のIXMLDOMDocumentを参照すると、タイプ情報レコードに記録されます。

タイプライブラリをロードして、ITypeLibを取得し、ITypeInfoを再帰的に列挙することによって、タイプライブラリをクロールすることができます。

このレコードが最終的に表示されます。次に、型の含まれる型ライブラリIDをITypeInfo::GetContainingTypeLibまで得ることができます。別のタイプライブラリを参照している場合、依存関係が見つかりました。

クローラは、読み込むタイプライブラリがなくなるまで、依存関係をすべて追跡することがあります。

厳密に必要なタイプのセットを見つけるためにすべてのタイプライブラリをすべてクロールする必要はありませんが、タイプライブラリインポータの仕事はタイプライブラリ情報を.NETタイプ情報およびメタデータアセンブリにミラーリングすることです型ライブラリを完全にインポートします。実行していることを説明/理解し、ルートタイプライブラリのコンテキスト外で出力を再利用するのは実装が簡単です。

早期バインディングを使用しなかった場合は、タイプライブラリにIDispatch,IUnknownおよび/またはVARIANTと表示され、依存関係を検出できなくなります。

登録不要のCOMを独立したアプリケーションで使用して、依存関係をソートすることができますが、依然として適切な依存関係ツリーである必要はありません。 1つのマニフェストにすべての依存関係を記述することができます。

そしてタイプライブラリ!= DLLを忘れないでください。タイプライブラリは、DLLまたはそれ自身のTLBファイルにリソースとして埋め込むことができます。

ので、この全体の話を約タイプ依存関係、ないクラス/コンポーネントまたは他のランタイムの依存関係です。

関連する問題