次の方法で共有


IEnumerable を実装するためのカスタム属性の適用

.NET Framework では、コレクションのオブジェクトを列挙するインターフェイスは、IEnumerable インターフェイスを継承する必要があります。 IEnumerable は、GetEnumerator という 1 つのメソッドを公開します。 アンマネージ COM ディスパッチ インターフェイスには、特別な DISPID (-4) を持つメンバー (DISPID_NEWENUM) が含まれており、インターフェイスが列挙できることを示します。 インポート時に、カスタム属性はアンマネージ COM インターフェイスに IEnumerable の実装を強制します。 このカスタム属性の構文は次のとおりです。

GUID = B64784EB-D8D4-4d9b-9ACD-0E30806426F7
Value = anything
メモメモ

IEnumerable カスタム タイプ ライブラリ属性は、ディスパッチ専用インターフェイス (dispinterface) またはデュアル インターフェイスにのみ適用できます。IUnknown から派生したインターフェイスは、IEnumerable を継承できません。したがって、カスタム属性を IUnknown から派生したインターフェイスに適用する場合、タイプ ライブラリ インポーターはその属性を無視します。

次の例はインターフェイス定義言語 (IDL) で記述されており、IEnumerable カスタム タイプ ライブラリ属性を使用して、IMyClass に IEnumerable の継承を強制する例を示します。

[
   object,
   uuid(40E86021-CAD7-493B-BF09-43811D821BA7),
   dual,
   helpstring("IMyClass Interface"),
   pointer_default(unique),
   // Use the IEnumerable custom attribute.
   custom(B64784EB-D8D4-4d9b-9ACD-0E30806426F7,"")
]
interface IMyClass : IDispatch
{
};

[
   uuid(3ACBCEB2-9D52-46FA-97E0-063310CFD776),
   helpstring("MyClass Class")
]
coclass MyClass
{
   [default] interface IMyClass;
};

タイプ ライブラリ インポート後の Microsoft Intermediate Language (MSIL) は、次のように表示されます。

.class interface public abstract auto ansi import IMyClass
implements [mscorlib]System.Collections.IEnumerable 
{
...
} // This is the end of class MyClass.

一般的には、MSIL を調査した後でコードに IEnumerable が実装されていないことがわかった場合は、このカスタム属性を使用して強制的に実装できます。

参照

参照

TypeLibConverter

ITypeLibConverter

Tlbimp.exe (タイプ ライブラリ インポーター)

概念

既定の COM ディスパッチ識別子 (DISPID) を上書きするためのカスタム属性の適用

カスタム属性を適用したアンマネージ COM の Get/Set プロパティのタグ付け

タイプ ライブラリのアセンブリとしてのインポート