Windows メタデータ (WinMD) ファイル

Windows ランタイム (WinRT) API .winmd は、マシンで読み取り可能なメタデータ ファイルで、拡張機能 ("メタデータ" とも呼ばれる) Windowsされています。 これらのメタデータ ファイルは、言語プロジェクションを有効にするために、ツールと言語プロジェクションによって使用されます。

一般的な注意事項

Windows、システム提供のすべての WinRT API のメタデータが含まれます。 Windowsは、実行時にこのメタデータを必要とする名前空間と型の解決に言語プロジェクションを支援する API を提供します。 Windows SDK は、コンパイル時にこのメタデータを必要とする言語プロジェクションで使用するために、1 つのファイル内のシステム メタデータのコピーを提供します。

サードパーティは、API が提供するシステムと同様に、言語プロジェクションに参加できる独自の WinRT API を開発する場合があります。 サードパーティの WinRT API は、システム API と同様にメタデータを提供する必要があります。 Windowsと型解決用の API は、システム メタデータの場合と同様に、サードパーティのメタデータに対して機能します。

WinMD ファイル内のすべてのパブリック型は WinRT 型である必要があります。また、tdWindowsRuntime フラグ (従う型フラグの詳細) を指定する必要があります。 WinMD ファイルには、WinRT 以外の型のメタデータが含まれる場合があります。 WinMD ファイル内の WinRT 以外の型はパブリックにできません。 WinRT 以外の型のセマンティクスは実装で定義され、このドキュメントの範囲を外しています。

WinRT 型のすべてのパブリック インターフェイス メンバー (メソッド、プロパティ、およびイベント) は、WinRT インターフェイス メンバーである必要があります。 WinRT 型には、WinRT 以外のインターフェイス メンバーのメタデータが含まれる場合があります。 WinRT 以外のインターフェイス メンバーはパブリックにできない場合があります。 WinRT 以外のインターフェイス メンバーのセマンティクスは、実装で定義され、このドキュメントのスコープ外です。

WinMD ファイル

WinMD ファイル形式

WinMD ファイルは、ECMA-335 仕様で定義されている共通言語ランタイム (CLR) アセンブリと同じ物理ファイル形式を使用します。 ただし、物理ファイル形式は同じですが、WinMD ファイルと CLR アセンブリでは、データの有効な組み合わせの規則が異なります。 このドキュメントでは、WinMD ファイルと CLR アセンブリ間の差分の一覧を示します。

システム提供の WinMD ファイルは純粋なメタデータです。 サードパーティの WinMD ファイルにはコードが含まれている場合があります。 特に、マネージド WinMD ファイルには、従来の CLR アセンブリと同様に、Microsoft Intermediate Language (MSIL) コードが含まれています。

すべての WinMD ファイルには、0 個以上の WinRT 型の定義が含まれている。 空の WinMD ファイルは技術的に有効です。

WinMD に一覧表示されている PEKind またはマシン アーキテクチャに対する特定の WinRT 制限はありません。

WinMD バージョンの文字列には、"Windows ランタイム 1.2" が含まれている必要があります。

WinMD ファイル名

WinMD ファイルの名前 (拡張子なし) は、WinMD ファイル内のアセンブリ テーブルの name 列と大文字と小文字を区別しない一致である必要があります。 たとえば、"Foo.Bar.winmd" ファイルは、アセンブリ テーブルの name 列に "Foo.Bar" を含む必要があります。 ファイル システムでは大文字と小文字が区別されません。ファイル名の大文字と小文字がアセンブリ テーブル名の列の値と異なる場合があります。

特定の WinMD ファイル内のすべての WinRT 型は、WinMD ファイルの名前とアセンブリ テーブル名列の値と一致する名前空間の下に置く必要があります。 ファイル システムでは大文字と小文字が区別されません。ファイル名の大文字と小文字は、特定の WinMD ファイル内のすべての WinRT 型の名前空間と異なる場合があります。 特定の WinMD 内のすべての WinRT 型の名前空間は、アセンブリ テーブル名の列の値と正確に一致する必要があります (つまり、大文字と小文字が区別されます)。 たとえば、アセンブリ テーブルの name 列に "Foo.Bar" が含むファイル内のすべての型は、"Foo.Bar" 名前空間に含む必要があります。 型は、この名前空間の直接の子 (Foo.Bar.MyType など) またはこの名前空間のサブ名前空間 (Foo.Bar.Baz.MyType など) のいずれかです。 ファイルの名前は "Foo.Bar.winmd" である必要がありますが、場合によって異なる場合があります。つまり、"foo.bar.winmd" と "FOO" です。バー。WINMD" は、このメタデータ ファイルのファイル名として許可されます。

WinMD コンポジション

システム内のすべての型のメタデータは、複数の .winmd ファイルに分散されます。 AppX パッケージには、アプリケーション パッケージに含まれるサードパーティの WinRT コンポーネントを記述する 0 個以上の .winmd ファイルを含めることもできます。

システムによって提供される 、または特定のアプリに含まれるすべての .winmd ファイル全体で、すべての WinRT 型のメタデータを WinMD ファイルに格納し、型の名前空間に一致する最も長い名前を使用する必要があります。 特定の名前空間の直接の子である型はすべて、同じファイルに含む必要があります。 たとえば、AppX パッケージに Foo.winmd ファイルと Foo.Bar.winmd ファイルが含まれる場合、Foo.Bar.Baz.MyType 型は Foo.Bar.winmd ファイルに含まれる必要があります。これは、パッケージ内の型の名前空間に一致するファイル名が最も長いファイルです。

TypeDef リダイレクト

システムによって提供されるメタデータ ファイルは、TypeDefs を直接参照する必要があります。 同じメタデータ ファイルで定義されている型を参照する場合でも、システム メタデータ ファイルは常に TypeRef を参照し、その後は TypeDef を参照します。 これは、CLR 型のリダイレクトをサポートするために行われます (たとえば、IListT として IVectorT<><>を投影します)。

サードパーティのメタデータ ファイルでは、TypeDef を直接使用したり、システム メタデータ ファイルと同様に TypeRef を介してすべての型参照をリダイレクトしたりすることもできます。

型システム エンコード

mscorlib アセンブリの System 名前空間のすべての型が、WinRT によってマーカーとして使用されます。 これらの型は型に関する情報を示すために使用され、決して解決されません。 これには、System.Object、System.Guid、System.ValueType、System.Enum、System.MulticastDelegate、System.Attribute が含まれます (ただし、これらに限定されません)。 これらの名前は CLR との互換性のために選択された点に注意してください。 CLR のこれらの型の定義は、その型システムの一部であり、WinRT とは関係しません。

ここで説明するコンストラクトの多くは、C# 構文を使用しています。 これは単に、C# 構文を使用して特定の共通言語インフラストラクチャ (CLI) メタデータコンストラクトを表すのが便利だからです。 実際のコンストラクトは純粋な CLI メタデータ コンストラクトです。

名前空間

WinRT は、型の名前空間とローカル名を 1 つのピリオド区切り文字列でエンコードします。 たとえば、このコード スニペットで定義されている型は"Windows。Foundation.ISimpleInterface"。

namespace Windows {
    namespace Foundation {
        interface ISimpleInterface {
            HRESULT Method1(int paramOne);
        };
    };
};

領域の最適化のために、CLI メタデータの TypeDef テーブルには、型名と名前空間名用に個別の列が用意されています。 ただし、API レベルでは、TypeDef プロパティは型名のみを公開します。

基本的な型

GUID を除くすべての WinRT 基本型には、CLI メタデータ BLOB および他の型参照で使用する明示的な定数値があります。 これらの定数値については、CLI 仕様のパーティション 2、セクション 23.1.16 で説明されています。

WinRT 型 CLI 要素の型名 CLI 要素の型の値
Int16 ELEMENT_TYPE_I2 0x06
Int32 ELEMENT_TYPE_I4 0x08
Int64 ELEMENT_TYPE_I8 0x0a
UInt8 ELEMENT_TYPE_U1 0x05
UInt16 ELEMENT_TYPE_U2 0x07
UInt32 ELEMENT_TYPE_U4 0x09
UInt64 ELEMENT_TYPE_U8 0x0b
Single ELEMENT_TYPE_R4 0x0c
Double ELEMENT_TYPE_R8 0x0d
Char16 ELEMENT_TYPE_CHAR 0x03
Boolean ELEMENT_TYPE_BOOL 0x02
String ELEMENT_TYPE_STRING 0x0e

このメソッドには明示的な ELEMENT_TYPE_ * 定数値がないため、Guid は、mscorlib アセンブリからの System.guid 型に対して TypeRef としてメタデータで表されます。

列挙型

列挙型は、次のように設定された列を含む TypeDef テーブル (ECMA II. 22.37) 内の行として表されます。

  • 示す. Public | に設定します。Sealed |tdWindowsRuntime (0x4101)。
  • 名前。 型の名前を含む文字列ヒープ内のインデックス。
  • 名前空間: 型の名前空間を格納している文字列ヒープ内のインデックス。
  • 拡張. Mscorlib アセンブリの System.enum クラスを参照する TypeRef に設定します。
  • FieldList. フィールドテーブルのインデックス。この型によって所有される連続したフィールドの最初の実行をマークします。
  • MethodList. は空である必要があります。

列挙型には、列挙型の基になる整数型、および0個以上の静的フィールドを指定する単一インスタンスフィールドがあります。列挙型によって定義された各列挙値に対して1つ。

列挙型の基になる整数型は、(上で指定した FieldList 列で参照されている) 型に関連付けられているフィールドテーブル (ECMA II. 22.15) の最初の行として表示されます。 列挙型のフィールドテーブルの列は次のとおりです。

  • フラグ: Private |SpecialName |RTSpecialName (0x601)。
  • Name: "value__" という名前を含む文字列ヒープ内のインデックス。
  • Signature: FieldSig blob (ECMA II. 23.2.4) を含む blob ヒープへのインデックス。 WinRT 列挙値は、符号付きまたは符号なし32ビット整数である必要があるため、ELEMENT_TYPE_I4 または ELEMENT_TYPE_U4 のいずれかに設定されます。

列挙値の定義の後に、列挙型の各値のフィールド定義が得られます。

  • フラグ: public |static |literal |hasdefault (0x8056)。
  • Name: 列挙値の名前を含む文字列ヒープ内のインデックス。
  • Signature: FieldSig blob (ECMA II. 23.3.4) を含む blob ヒープへのインデックス。型は列挙型の TypeDef に設定されています。

列挙値の定義ごとに、定数テーブル (ECMA II. 22.9) に対応する行が列挙値の整数値を格納します。

  • [Type](種類)。 列挙型の基になる型を表す1バイト。 ELEMENT_TYPE_I4 または ELEMENT_TYPE_U4 の後に、ECMA 仕様に従って1バイトの埋め込み0が続きます。
  • Parent: 関連付けられた列挙値レコードを保持するフィールドテーブルにインデックスを作成します。
  • 値: 列挙値の整数値が格納されている blob テーブルにインデックスを作成します。

さらに、基になる UInt32 型の列挙体については、FlagsAttribute を enumeration TypeDef 行に追加する必要があります。 基になる Int32 型の列挙については、FlagsAttribute を enum TypeDef 行に追加しないでください。

システムが提供するすべての列挙型に対して、VersionAttribute を列挙体の TypeDef 行に追加する必要があります。 必要に応じて、静的なフィールド行に VersionAttribute を追加できます。 存在する場合、任意の列挙型フィールド行の VersionAttribute のバージョン値は、enum TypeDef 行の VersionAttribute の値以上である必要があります。

構造体

構造体は、次のように列を設定して、TypeDef テーブル (ECMA 22.37) の行として実装されます。

  • Flags – Public |Sealed |シーケンシャル |tdWindowsRuntime (0x4109)。
  • Name –型の名前を含む文字列ヒープ内のインデックス。
  • 名前空間–型の名前空間を含む文字列ヒープ内のインデックス。
  • Extends – mscorlib アセンブリの system.servicemodel クラスを参照する TypeRef に設定されます。
  • FieldList –フィールドテーブル内のインデックス。この型によって所有される連続したフィールドの最初の実行をマークします。
  • MethodList –空にする必要があります。

構造体には、1つまたは複数のフィールドテーブルエントリがあります。

  • Flags: public。
  • 名前: フィールドの名前を含む文字列ヒープ内のインデックス。
  • Signature: FieldSig blob (ECMA II. 23.2.4) を含む blob ヒープへのインデックス。種類は、フィールドの種類のメタデータトークンに設定されています。
    • 構造体フィールドは、基本型、列挙型、またはその他の構造体である必要があります。

システム指定のすべての構造体に対して、VersionAttribute を struct TypeDef 行に追加する必要があります。

代理人

デリゲートは、次のように設定された列を含む TypeDef テーブル (ECMA II. 22.37) に行として実装されます。

  • Flags: Public | に設定します。Sealed |tdWindowsRuntime (0x4101)。
  • Name –型の名前を含む文字列ヒープ内のインデックス。
  • 名前空間–型の名前空間を含む文字列ヒープ内のインデックス。
  • 拡張: mscorlib アセンブリの MulticastDelegate クラスを参照する TypeRef に設定します。
  • FieldList: 空にする必要があります。
  • MethodList: MethodDef テーブル (ECMA II. 22.26) のインデックス。この型によって所有されているメソッドのうち、連続するメソッドの最初の実行をマークします。

デリゲート ' TypeDef rows には GuidAttribute が必要です。

デリゲートには、厳密に2つの MethodDef テーブルエントリがあります。 最初のは、コンストラクターを定義します。 このコンストラクターは互換性マーカーです。これは、ネイティブ int などの非 WinRT 構造体や、以外のパラメーター inout を使用するためのものです。 WinRT デリゲートには、そのようなコンストラクターメソッドはありません。

  • RVA: 0 (抽象コンストラクト)。
  • ImplFlags: runtime (0x03)。
  • フラグ: private |hidebysig |specialname |RTSpecialName (0x1881)。
  • 名前: ".ctor" という名前を含む文字列テーブルのインデックス。
  • Signature: パラメーターにオブジェクトとネイティブ int を持つメソッドの MethodDefSig blob (ECMA 23.2.1) を含む blob ヒープへのインデックス。戻り値はありません。
  • ParamList: このメソッドに関連付けられている Param 行の実行の最初のを格納している Param テーブル (ECMA II. 22.33) のインデックス。 Param テーブルの各行には、次の情報が含まれています。
    • オブジェクトパラメーター
      • シーケンス1
      • "オブジェクト" という名前
      • フラグ: なし (0x00)
    • Native Int パラメーター
      • シーケンス2
      • "Method" という名前
      • フラグ: なし (0x00)

2番目の MethodDef エントリは、Invoke メソッドを定義します。

  • RVA: 0 (抽象コンストラクト)
  • ImplFlags: runtime (0x03)
  • フラグ: public |Virtual |HideBySig |specialname (0x08C6)
  • 名前: "Invoke" という名前を含む文字列テーブルのインデックス
  • Signature: デリゲートのパラメーターの型と戻り値の型を含む MethodDefSig blob (ECMA II. 23.2.1) を含む blob ヒープへのインデックス。 デリゲートがパラメーター化されている場合、MethodDefSig blob は、GENERICINST エンコードされた型 (ECMA II. 23.2.12 など) を介して、各デリゲート型パラメーターを参照する必要があります。 実行するパラメーター化されたデリゲートの詳細。
  • ParamList: このメソッドに関連付けられている Param 行の実行の最初のを格納している Param テーブル (ECMA II. 22.33) のインデックス。 Param テーブルの各行には、次の情報が含まれます。
    • Flags –パラメーターに対して、必要に応じて in または out
    • Sequence –パラメーターのシーケンス順。 0は、メソッドの戻り値用に予約されています。
    • Name –システムによって提供されるすべてのデリゲートのパラメーターの名前を含む文字列ヒープ内のインデックス。 VersionAttribute をデリゲートの TypeDef 行に追加する必要があります。

パラメーター化されたデリゲート

パラメーター化されたデリゲートには、次の追加要件があります。

  • パラメーター化されたデリゲートの名前には、バックティックと、パラメーター化されたデリゲートに含まれる型パラメーターの数を表す数値が付加されます。 たとえば、Windows のようになります。Foundation. EventHandler < T > 型は、Windows という名前のメタデータに格納されます。Foundation. EventHandler ' 1。
  • パラメーター化されたデリゲートは、次のように設定された列を持つすべての型パラメーターについて、GenericParam テーブル (ECMA II. 22.20) の1つの行を持ちます。
    • Number: ジェネリックパラメーターのインデックス。左から右に番号が付けられ、0から始まります。
    • Flags: なし。
    • Owner: インターフェイスを含む行の TypeDef テーブルにインデックスを作成します。
    • Name: ジェネリックパラメーターの名前を格納している文字列ヒープ内のインデックス。

TypeSpec テーブル (ECMA II. 23.2.14) を使用して、パラメーター化されたデリゲートのインスタンスを定義します。 このような TypTypeRefs Ecs は、メソッドシグネチャでも同様に使用できます。

インターフェイス

インターフェイスは、次のように設定された列を含む TypeDef テーブル (ECMA II. 22.37) に行として実装されます。

  • Flags:
    • interface |public |abstract |tdWindowsRuntime (0x40A1)、または
    • interface |NotPublic |abstract |tdWindowsRuntime (0x40A0)
  • Name: インターフェイス名を含む文字列テーブルのインデックス。
  • 名前空間–型の名前空間を含む文字列ヒープ内のインデックス。
  • 拡張: null。
  • FieldList: 空にする必要があります。
  • MethodList: MethodDef テーブルへのインデックス。この型によって所有されているメソッドの連続した実行の最初の位置をマークします。 MethodDef テーブルの内容の詳細については、現在のセクションのサブセクションで詳しく説明します。

インターフェイス ' TypeDef 行には、GuidAttribute および VersionAttribute が必要です。

プライベート可視性を持つ WinRT インターフェイスには、1つの ExclusiveToAttribute が必要です。 パブリック可視性を持つ WinRT インターフェイスには、ExclusiveToAttribute を指定できません。 存在する場合、ExclusiveToAttribute はランタイムクラスを参照する必要があります。

インターフェイスに必要なインターフェイスは、次のように列が設定された InterfaceImpl テーブル (ECMA II. 22.23) の行によって表されます。

  • Class: インターフェイスを含む行の TypeDef テーブルへのインデックス。
  • Interface: 必要なインターフェイスを指定する TypeDef、TypeRef、または TypeSpec テーブルのインデックス。 システムによって提供されるメタデータファイルでは、必要なインターフェイスが同じメタデータファイルで定義されている場合でも、これは TypeDef になることはありません。 詳細については、「TypeDef リダイレクト」セクションを参照してください。

パラメーター化されたインターフェイス

パラメーター化されたインターフェイスには、次の追加要件があります。

パラメーター化されたインターフェイスの名前には、バックティックと、パラメーター化されたデリゲートに含まれる型パラメーターの数を表す数値が付加されます。 たとえば、Windows のようになります。Foundation. IVector < T > 型は、Windows という名前のメタデータに格納されます。Foundation. IVector ' 1.

パラメーター化されたインターフェイスには、次のように設定された列を持つすべての型パラメーターについて、GenericParam テーブル (ECMA II. 22.20) の1つの行があります。

  • Number: ジェネリックパラメーターのインデックス。左から右に番号が付けられ、0から始まります。
  • Flags: なし。
  • Owner: インターフェイスを含む行の TypeDef テーブルにインデックスを作成します。
  • Name: ジェネリックパラメーターの名前を格納している文字列ヒープ内のインデックス。

TypeSpec テーブル (ECMA II. 23.2.14) を使用して、パラメーター化されたインターフェイスのインスタンスを定義します。 これらの Typecs は、TypeRefs と同様に、メソッドのシグネチャとインターフェイスの実装で使用できます。

インターフェイス メンバー

配列のパラメーター

任意のインターフェイスメンバー型に対して配列パラメーターをエンコードする場合、配列パラメーターの直前にある配列長パラメーターは、params テーブルと同様に、MethodDefSig blob からも省略されます。

配列パラメーターの方向は、メタデータで直接エンコードされます。 配列長パラメーターの方向は次のように推論できます。

  • 配列パラメーターが in パラメーターの場合、配列の長さパラメーターも in パラメーターである必要があります。
  • 配列パラメーターが out パラメーターで、BYREF マーカーを実行していない場合、配列の長さは in パラメーターになります。
  • 配列パラメーターが out パラメーターで、BYREF マーカーを格納している場合、配列の長さは out パラメーターになります。

メソッド

予期されるメソッドの射影と CLR の互換性をより適切にモデル化するために、必要な HRESULT 戻り値はメタデータでエンコードされません。 代わりに、戻り値として使用される out パラメーターは、methodDefSig の戻り値としてエンコードされます。 戻り値として使用する out パラメーターを宣言しないメソッドの場合、methodDefSig は戻り値の型を void として宣言する必要があります (ECMA II. 23.2.11 のように)。

インターフェイスの各メソッドは、MethodDef テーブル内の行として表されます。 各 methoddef 行には、次の情報が含まれます。

  • RVA: 0x00
  • ImplFlags: 0x00
  • フラグ: public |Virtual |HideBySig |Abstract |NewSlot |インスタンス (0x5c6)
  • Name: メソッドの名前を含む文字列テーブルのインデックス
  • Signature: メソッドのパラメーターの型と戻り値の型を含む MethodDefSig blob (ECMA II. 23.2.1) を含む blob ヒープへのインデックス。 インターフェイスがパラメーター化されている場合、MethodDefSig blob は、GENERICINST でエンコードされた型 (ECMA II. 23.2.12 など) を介して、各インターフェイスの型パラメーターを参照する必要があります。 実行するパラメーター化されたインターフェイスの詳細。
  • ParamList: このメソッドに関連付けられている Param 行の実行の最初のを格納している Param テーブル (ECMA II. 22.33) のインデックス。

メソッドの各パラメーター (指定されている場合は戻り値を加算したもの) には、Param テーブルの対応する行が含まれます (ECMA II. 22.33)。

  • Flags –なし、パラメーターに必要な場合は in または out。
    • 戻り値は常に none です。
    • その他のパラメーターは常に in または out です。
  • Sequence –パラメーターのシーケンス順。
    • 0は、メソッドの戻り値用に予約されています。
  • Name –パラメーターの名前を含む文字列ヒープ内のインデックス。

各メソッドには、(インターフェイスのスコープ内で) 一意のメソッド名を含む OverloadAttribute が必要になる場合があります。 各メソッドには、必要に応じて、動的に型指定された脆弱な言語で射影する必要がある、同じアリティのオーバーロードされたメソッド (in パラメーターの数) を示す Windows.foundation.metadata.defaultoverloadattribute が必要になる場合があります。

Properties

インターフェイスの各プロパティは、プロパティ (ECMA II. 22.34)、PropertyMap (ECMA II. 22.35)、MethodSemantics (ECMA II. 22.28)、および MethodDef (ECMA II. 22.26) の各テーブルの行として定義されます。

1つ以上のプロパティを持つ各インターフェイスは、次の情報を含む PropertyMap テーブルの単一の行として表されます。

  • Parent: プロパティを含むインターフェイスを含む TypeDef テーブルのインデックス。
  • PropertyList: この型に関連付けられた行の実行の最初のを格納しているプロパティテーブルのインデックス。

各プロパティは、次の情報を含むプロパティテーブルの単一行として表されます。

  • Flags: なし。
  • Name: プロパティの名前を格納している文字列ヒープ内のインデックス。
  • Type: プロパティの型情報を含む PropertySig blob (ECMA 23.2.5) を含む blob ヒープへのインデックス。

各プロパティは、MethodDef テーブル内の1つまたは2つの行として表されます。 読み取り専用プロパティは、"get_" プレフィックスを持つ1つのメソッドとして表されます。一方、読み取り/書き込みプロパティは、"get_" を持ち、もう一方に "put_" プレフィックスが付いた2つのメソッドとして表されます。 Get メソッドのシグネチャは、パラメーターを取らず、プロパティの型の値を返します。 Set メソッドのシグネチャは、プロパティの型の1つのパラメーターを受け取り、何も返しません。

プロパティの MethodDef 行には、次のものが含まれます。

  • RVA: 0
  • ImplFlags: なし
  • フラグ: public |virtual |HideBySig |newSlot |abstract |specialname (0xDC6)
  • Name: "get_ < propertyname > " または "put_ < PropertyName > " を含む文字列テーブルのインデックス (該当する場合)
  • Signature: 前述のとおり、メソッドのパラメーターの型と戻り値の型を含む MethodDefSig blob (ECMA II. 23.2.1) を含む blob ヒープへのインデックス。
  • ParamList: このメソッドに関連付けられている Param 行の実行の最初のを格納している Param テーブル (ECMA II. 22.33) のインデックス。 Param テーブルの値は、上記のメソッドの下で指定されています。

プロパティの各 MethodDef 行には、次の情報を含む MethodSemantics テーブルに関連付けられた行があります。

  • セマンティクス: 必要に応じて Getter または Setter。
  • Method: getter または setter メソッドを含む MethodDef テーブルにインデックスを作成します。
  • Association: プロパティを含むプロパティテーブルにインデックスを作成します。

イベント

インターフェイス上の各イベントは、Event (ECMA II.22.13)、EventMap (ECMA II.22.12)、MethodSemantics (ECMA II.22.28)、MethodDef (ECMA II.22.26) テーブルの行として定義されます。

1 つ以上のイベントを含む各インターフェイスは、次の情報を含む EventMap テーブルの 1 つの行として表されます。

  • 親: プロパティを含むインターフェイスを含む TypeDef テーブルへのインデックス。
  • EventList: この型に関連付けられた行の実行の最初の を含む Event テーブルへのインデックス。

各イベントは、次の情報を含む Event テーブルの 1 つの行として表されます。

  • EventFlags: なし。
  • 名前: プロパティの名前を含む文字列ヒープ内のインデックス。
  • EventType: イベントのデリゲート型を含む適切なテーブルにインデックスを作成する TypeDefOrRef。

各イベントは、MethodDef テーブルの 2 つの行として表されます。1 つはイベント リスナーを追加するための "add_" プレフィックスを持ち、もう 1 つはイベント リスナーを削除するための "remove_" プレフィックスを持つ行です。 add メソッドはデリゲート インスタンスを受け取り、デリゲート インスタンスをWindows。イベント登録を表す Foundation.EventRegistrationToken。 remove メソッドは、add メソッドによって返された EventRegistrationToken を受け取り、イベントの登録を解除します。

イベントの MethodDef 行には、次が含まれます。

  • RVA: 0
  • ImplFlags: None
  • フラグ: パブリック |最終|仮想|hidebysig |newslot |specialname (0x09e6)
  • 名前: 必要に応じて、"add_PropertyName>" または "remove_<PropertyName>" を含む文字列テーブル<へのインデックス。
  • シグネチャ: メソッドのパラメーターと戻り値の型を含む MethodDefSig BLOB (ECMA II.23.2.1) を含む BLOB ヒープへのインデックス。以下で説明します。
    • Add_メソッドは、デリゲート型の 1 つのパラメーターを受け取り、デリゲート型をWindows。Foundation.EventRegistrationToken。
    • Remove_メソッドは 1 つのメソッドをWindows。Foundation.EventRegistrationToken パラメーターと は何も返しません。
  • ParamList: Param テーブル (ECMA II.22.33) へのインデックス。メソッドに関連付けられた Param 行の実行の最初の が含まれます。 Param テーブルの値は、上記のメソッドで指定した値です。

イベントの MethodDef 行は両方とも、次の情報を含む MethodSemantics テーブルに関連付けられた行を持っています。

  • セマンティクス: 必要に応じて AddOn または RemoveOn。
  • メソッド: add または remove リスナー メソッドを含む MethodDef テーブルにインデックスを作成します。
  • 関連付け: イベントを含むイベント テーブルへのインデックス。

ランタイム クラス

ランタイム クラスは、TypeDef テーブル (ECMA II.22.37) の行として実装され、列は次のように設定されます。

  • フラグ: すべてのランタイム クラスは、パブリック、自動レイアウト、クラス、および tdWindowsRuntime フラグを持つ必要があります。
    • 静的クラスだけが抽象フラグを持っています。 その他のすべてのクラスは、抽象フラグを持つ必要はありません。
    • 構成できないクラスは、sealed フラグを持っています。 構成可能なクラスは、シール フラグを持ち込む必要はありません。
  • 名前: クラス名を含む文字列テーブルへのインデックス。
  • 名前空間 – 型の名前空間を含む文字列ヒープへのインデックス。
  • 拡張: mscorlib の構成可能なクラスまたは System.Object のいずれかを参照する TypeRef へのインデックス。
  • FieldList: 空である必要があります。
  • MethodList: MethodDef テーブルへのインデックス。この型によって所有されるメソッドの連続した実行の最初の部分をマークします。 MethodDef テーブルの内容の詳細を以下に示します。

システム指定のすべてのクラスについて、VersionAttribute をクラスの TypeDef 行に追加する必要があります。

実装されるインターフェイス

ランタイム クラスによって実装されるインターフェイスは、InterfaceImpl テーブル (ECMA II.22.23) の行で表され、列は次のように設定されます。

  • クラス: 型を含む行の TypeDef テーブルへのインデックス。
  • インターフェイス: 実装されたインターフェイスを指定する TypeDef、TypeRef、または TypeSpec テーブルへのインデックス。 システムで提供されるメタデータ ファイルでは、必要なインターフェイスが同じメタデータ ファイルで定義されている場合でも、これは TypeDef ではありません。 詳細については、「TypeDef リダイレクト」セクションを参照してください。

ランタイム クラスは、InterfaceImpl 行の 1 行に対して DefaultAttribute を指定する必要があります。

ランタイム クラスは、任意の InterfaceImpl 行で OverridableAttribute または ProtectedAttribute を指定できます。 同じ行で OverridableAttribute と ProtectedAttribute の両方を指定できません。

必要に応じて、VersionAttribute をクラスの interfaceImpl 行に追加できます。 クラスのインターフェイスImpl 行の VersionAttribute のバージョン値は、クラスの TypeDef 行の VersionAttribute の値以上である必要があります。

静的インターフェイス

ランタイム クラスには、0 個以上の StaticAttribute カスタム属性があります。 それぞれ異なる指定されたパラメーターがある限り、複数の StaticAttribute カスタム属性を指定して問題はありません。 StaticAttribute は、次の情報を含む行として CustomAttribute テーブルに表示されます。

  • 親: StaticAttribute が関連付けられているランタイム クラス。
  • 種類: StaticAttribute の .ctor への参照。
  • 値: System.Type 静的インターフェイス パラメーターと Uint32 バージョン パラメーターを含むカスタム属性 BLOB。

アクティベーション

ランタイム クラスには、0 個以上の ActivatableAttribute カスタム属性があります。 それぞれが異なる指定されたパラメーターを持っている限り、複数の ActivatableAttribute カスタム属性を指定すると有効です。 すべての ActivatableAttributes は、次の情報を含む行として CustomAttribute テーブルに表示されます。

  • 親: ActivatableAttribute が関連付けられているランタイム クラス。
  • 種類: ActivatableAttribute の 2 つの .ctor の 1 つへの参照。
    • 直接アクティブ化: Uint32 バージョン パラメーターを受け取る .ctor。
    • ファクトリのアクティブ化: System.Type ファクトリ インターフェイス パラメーターと Uint32 バージョン パラメーターを受け取る .ctor。
  • 値: System.Type ファクトリ インターフェイス パラメーター (指定されている場合) と Uint32 バージョン パラメーターを含むカスタム属性 BLOB。

コンポジション

ランタイム クラスには、0 個以上の ComposableAttribute カスタム属性があります。 それぞれが異なる指定されたパラメーターを持っている限り、複数の ComposableAttribute カスタム属性を指定すると便利です。 すべての ComposableAttribute は、次の情報を含む行として CustomAttribute テーブルに表示されます。

  • 親: ComposableAttribute が に関連付けられているランタイム クラス。
  • 種類: ComposableAttribute の .ctor への参照。
  • 値: System.Type コンポジション ファクトリ インターフェイス インターフェイス パラメーター、CompositionType 列挙値 (Public または Protected) と Uint32 バージョン パラメーターを含むカスタム属性 BLOB。

クラス メソッド

ランタイム クラスには、 クラスに関連付けられているすべてのインターフェイスのすべてのメソッドの MethodDef テーブルに行があります。 これには、メンバー インターフェイス (通常、保護、オーバーライド可能)、静的インターフェイス、アクティブ化ファクトリ インターフェイス、および構成可能なファクトリ インターフェイスが含まれます。 さらに、直接アクティブ化をサポートするクラスには、これを示す行も MethodDef テーブルに含まれる必要があります。

メンバー インターフェイス のメンバー

メンバー インターフェイスの各メソッド (保護されたインターフェイスとオーバーライド可能なインターフェイスを含む) は、クラスの MethodDef テーブルの行によって表されます。 クラスの methodDef テーブルには、Param テーブルの行やカスタム属性など、元の宣言インターフェイスからの MethodDef 情報の正確なコピーが含まれています。ただし、次の例外があります。

  • ランタイム クラスでは、メンバー インターフェイスで定義されているメソッドの代替名を指定できます。
  • ランタイム クラスのメソッドは、Abstract フラグを取得できません。
  • ランタイム クラスのメソッドは、Runtime MethodImpl フラグを取得します。
  • さらに、オーバーライドできないインターフェイスのメソッドは Final フラグを取得します。 オーバーライド可能なインターフェイスのメソッドは、Final フラグを取得できません。

メンバー インターフェイスのクラスの MethodDef テーブル内の各行は、次のように値を持つ MethodImpl テーブル (ECMA II.22.27) のエントリを使用して、メソッドを最初に定義したインターフェイス メソッドに接続されます。

  • クラス – メソッドを実行するクラスを参照する TypeDef テーブルへのインデックスです (このインデックスは TypeDef リダイレクトの対象ではありません)。
  • MethodBody – クラス メソッドを参照する MethodDef テーブルへのインデックス。
  • MethodDeclaration – 最初に宣言されたインターフェイス メソッドを参照する MethodDef または MemberRef テーブルへのインデックス。
静的インターフェイス メンバー

静的インターフェイスの各メソッドは、クラスの MethodDef テーブルの行によって表されます。 クラスの methodDef テーブルには、Param テーブルの行やカスタム属性など、元の宣言インターフェイスからの MethodDef 情報の正確なコピーが含まれています。ただし、次の例外があります。

  • 静的メンバーは、Virtual、Abstract、NewSlot、Instance フラグを取得しない。
  • 静的メンバーは、Static フラグと Class フラグを取得します。
  • ランタイム クラスの静的メソッドは、Runtime MethodImpl フラグを取得します。
アクティブ化メンバー

直接のパラメーターなしアクティブ化をサポートするクラスには、次の列値を持つクラスの MethodDef テーブルにコンストラクター行があります。

  • RVA: 0x00
  • ImplFlags: ランタイム
  • フラグ: パブリック |HideBySig |SpecialName |RTSpecialName |インスタンス
  • Name: ".ctor" を含む文字列テーブルのインデックス
  • Signature: パラメーターを含まず、null を返す MethodDefSig blob (ECMA II. 23.2.1) を含む blob ヒープへのインデックス。
  • ParamList: 空にする必要があります

ファクトリアクティベーションをサポートするクラスは、実装されているすべてのファクトリインターフェイスのすべてのメソッドに対して、次の列の値を持つコンストラクター行をクラスの MethodDef テーブルに保持します。

  • RVA: 0x00
  • ImplFlags: Runtime
  • フラグ: public |HideBySig |SpecialName |RTSpecialName |Instance
  • Name: ".ctor" を含む文字列テーブルのインデックス。
  • Signature: 入力パラメーターを含み、null を返す MethodDefSig blob (ECMA II. 23.2.1) を含む blob ヒープへのインデックス。
  • ParamList: すべてのパラメーターの行を含む Params テーブルへのポインター。最初に宣言したファクトリメソッドに対して params テーブルとまったく同じようにコピーされます。
コンポジションのメンバー

コンポジションファクトリアクティベーションをサポートするクラスは、実装されているすべてのファクトリインターフェイスのすべてのメソッドに対して、次の列の値を持つコンストラクター行をクラスの MethodDef テーブルに保持します。

  • RVA: 0x00
  • ImplFlags: Runtime
  • フラグ: public |HideBySig |SpecialName |RTSpecialName |Instance
  • Name: ".ctor" を含む文字列テーブルのインデックス。
  • Signature: カスタム入力パラメーターを含み、null を返す MethodDefSig blob (ECMA II. 23.2.1) を含む blob ヒープへのインデックス。 制御 IInspectable * [in] パラメーターと非デリゲート IInspectable * * [out] パラメーターは、メソッドシグネチャには反映されません。
  • ParamList: 制御 IInspectable * [in] パラメーターと非デリゲート IInspectable * * [out] パラメーターを除くすべてのパラメーターの行を含む Params テーブルへのポインターは、最初に宣言したファクトリメソッドの params テーブルとまったく同じようにコピーされます。

カスタム属性

カスタム属性には0個以上のコンストラクターメソッドがあり、それぞれが0個以上のパラメーターを持ち、パラメーターの型が基本型、列挙型、および system.string に限定されます。 カスタム属性の各コンストラクターは、次の情報と共に MethodDef 内の行として表示されます。

  • RVA (相対仮想アドレス): null
  • ImplFlags: なし
  • フラグ: public |HideBySig |specalname |RTSpecialName (0x1886)
  • 名前: ".ctor" という名前を含む文字列テーブルのインデックス。
  • Signature: メソッドのパラメーターの型と戻り値の型を含む MethodDefSig blob (ECMA II. 23.2.1) を含む blob ヒープへのインデックス。
  • ParamList: このメソッドに関連付けられている Param 行の実行の最初のを格納している Param テーブル (ECMA II. 22.33) のインデックス。

メタデータ構造のカスタム属性は、列が次のように設定された CustomAttribute テーブル (ECMA II. 22.10) に行として格納されます。

  • Parent: カスタム属性がアタッチされているメタデータテーブルにインデックスを設定します。
  • Type: 属性の型のコンストラクターへの参照を含む MethodDef テーブルまたは MemberRef テーブルへのインデックス。
  • Value: 位置指定属性パラメーターと名前付き属性パラメーター (ECMA II. 23.2) を含む blob ヒープへのインデックス。 WinRT カスタム属性はプロパティを持つことができないため、カスタム属性 blob にはプロパティスタイルの名前付き引数が含まれないことに注意してください。