Visual Studioタイプライブラリインポータがタイプライブラリの依存関係を追いかける理由は、.NETにマップする型情報を収集するためです。
タイプライブラリには、直接の依存関係の情報はありません。だからこれは非常に良い質問です:型ライブラリの依存関係をどのように追跡するのですか?
唯一実現可能型ライブラリ依存性を検出する方法は、宣言型ライブラリを記述する型を参照することです。
たとえば、タイプライブラリでメソッドの署名のIXMLDOMDocument
を参照すると、タイプ情報レコードに記録されます。
タイプライブラリをロードして、ITypeLib
を取得し、ITypeInfo
を再帰的に列挙することによって、タイプライブラリをクロールすることができます。
このレコードが最終的に表示されます。次に、型の含まれる型ライブラリIDをITypeInfo::GetContainingTypeLib
まで得ることができます。別のタイプライブラリを参照している場合、依存関係が見つかりました。
クローラは、読み込むタイプライブラリがなくなるまで、依存関係をすべて追跡することがあります。
厳密に必要なタイプのセットを見つけるためにすべてのタイプライブラリをすべてクロールする必要はありませんが、タイプライブラリインポータの仕事はタイプライブラリ情報を.NETタイプ情報およびメタデータアセンブリにミラーリングすることです型ライブラリを完全にインポートします。実行していることを説明/理解し、ルートタイプライブラリのコンテキスト外で出力を再利用するのは実装が簡単です。
早期バインディングを使用しなかった場合は、タイプライブラリにIDispatch
,IUnknown
および/またはVARIANT
と表示され、依存関係を検出できなくなります。
登録不要のCOMを独立したアプリケーションで使用して、依存関係をソートすることができますが、依然として適切な依存関係ツリーである必要はありません。 1つのマニフェストにすべての依存関係を記述することができます。
そしてタイプライブラリ!= DLLを忘れないでください。タイプライブラリは、DLLまたはそれ自身のTLBファイルにリソースとして埋め込むことができます。
ので、この全体の話を約タイプ依存関係、ないクラス/コンポーネントまたは他のランタイムの依存関係です。
*依存関係の情報もありますので、このような依存型ライブラリ(HKLM \ Software \ Wow6432Node \ Classes \ Typelibキー)を見つけるのに役立ちます* - この依存関係情報はどこですか? – acelent
タイプライブラリにあります。 Oleview.exeを使用して、importlib()ステートメントを参照してください。 –
ええ、TLBは本当にインポートされたライブラリを参照しているようです。ただし、tlbimp.exe&co。 'ITypeLib'から利用可能なデータをたどるだけで、ITypeInfo(継承、メソッドの引数、メソッドの戻り値の型、フィールドの型など)を含むインタフェース、構造体などの' ITypeInfo'を返します。基本的には 'ITypeInfo :: GetContainingTypeLib'を介して他の型ライブラリに含まれています。 – acelent