型の等価性と埋め込まれた相互運用機能型
.NET Framework 4 以降、共通言語ランタイムでは、マネージド アセンブリに COM 型の型情報を直接埋め込めるようになりました。マネージド アセンブリで相互運用アセンブリから COM 型の型情報を取得する必要がありません。 埋め込まれる型情報にはマネージド アセンブリに実際に使用される型とメンバーのみが含まれるため、2 つのマネージド アセンブリで同じ COM 型の表示が非常に異なることが考えられます。 マネージド アセンブリごとに、COM 型の表示を表す異なる Type オブジェクトが与えられます。 共通言語ランタイムでは、インターフェイス、構造、列挙、委任といった異なる表示間で型の等価性が与えられます。
型の等価性とは、マネージド アセンブリ間で渡される COM オブジェクトを受け取り側のアセンブリで適切なマネージド型に変換できることを意味します。
Note
型の等価性と埋め込まれた相互運用機能型により、COM コンポーネントを利用するアプリケーションとアドインの展開が簡単になります。アプリケーションで相互運用アセンブリを展開する必要がないためです。 ただし、以前のバージョンの .NET Framework でコンポーネントを利用する場合、共有 COM コンポーネントの開発者はプライマリ相互運用アセンブリ (PIA) を作成する必要があります。
型の等価性
COM 型の等価性は、インターフェイス、構造、列挙、委任でサポートされています。 COM 型は、次のすべてに該当する場合に等価となります。
型がいずれもインターフェイスであるか、いずれも構造であるか、いずれも列挙であるか、いずれも委任である。
型の ID が同じである (次のセクションに詳細あり)。
いずれの型も、型の等価性に適合する (「型の等価性の資格ありとして COM 型を設定する」セクションに詳細あり)。
型の ID
範囲と ID が一致するとき、言い換えると、それぞれに TypeIdentifierAttribute 属性が含まれ、2 つの属性の Scope プロパティと Identifier プロパティが一致する場合、2 つの型の ID が同じであると判断されます。 Scope の比較では、大文字と小文字が区別されません。
型に TypeIdentifierAttribute 属性が含まれない場合、あるいは範囲や識別子を指定しない TypeIdentifierAttribute 属性が型に含まれる場合も、型は次のように等価性適用として考慮されます。
インターフェイスの場合、GuidAttribute の値が TypeIdentifierAttribute.Scope プロパティの代わりに使用されます。Type.FullName プロパティ (つまり、名前空間を含む、型の名前) が TypeIdentifierAttribute.Identifier プロパティの代わりに使用されます。
構造、列挙、委任の場合、含んでいるアセンブリの GuidAttribute が Scope プロパティの代わりに使用されます。Type.FullName プロパティが Identifier プロパティの代わりに使用されます。
型の等価性に適合するものとして COM 型を設定する
型の等価性に適合するものとして 2 つの方法で型を設定できます。
型に TypeIdentifierAttribute 属性を適用します。
型を COM インポート型にします。 ComImportAttribute 属性が与えられていると、インターフェイスは COM インポート型となります。 それが定義されているアセンブリに ImportedFromTypeLibAttribute 属性が含まれる場合、インターフェイス、構造、列挙、委任は COM インポート型となります。
関連項目
.NET