Share via


Windows 中繼資料 (WinMD) 檔案

Windows 執行階段 (WinRT) api 會在電腦可讀取的中繼資料檔案中描述,副檔名 .winmd (也稱為 Windows 中繼資料) 。 這些中繼資料檔案是由工具和語言投射使用,以便啟用語言投射。

一般注意事項

Windows 包含所有系統提供之 WinRT api 的中繼資料。 Windows 提供 api,以協助在執行時間需要此中繼資料的命名空間和類型的解析中進行語言預測。 Windows SDK 會在單一檔案中提供系統中繼資料的複本,以供在編譯時期需要此中繼資料的語言預測使用。

協力廠商可開發自己的 WinRT Api 來參與語言投射,例如系統提供的 Api。 協力廠商 WinRT Api 必須提供中繼資料,就像系統 Api 一樣。 命名空間和類型解析的 Windows api 適用于協力廠商的中繼資料,就像是針對系統中繼資料所做的一樣。

WinMD 檔案中的所有公用類型都必須是 WinRT 類型,而且必須包含 tdWindowsRuntime 旗標 (詳細資料,以遵循) 的類型旗標。 WinMD 檔案可能包含非 WinRT 類型的中繼資料。 WinMD 檔案中的任何非 WinRT 類型都不能是公用的。 非 WinRT 類型的語義是在此檔的範圍內進行的實作為定義。

在 WinRT 類型上) 的所有公用介面成員 (方法、屬性和事件都必須是 WinRT 介面成員。 WinRT 類型可能包含非 WinRT 介面成員的中繼資料。 任何非 WinRT 介面成員都不能是公用的。 非 WinRT 介面成員的語義是在這份檔的範圍內進行的實作為定義。

WinMD 檔案

WinMD 檔案格式

WinMD 檔案使用與 Common Language Runtime 相同的實體檔案格式, (CLR) 元件(如 ECMA-335 規格所定義)。 不過,雖然實體檔案格式相同,但是 WinMD 檔案和 CLR 元件的有效資料組合規則會有所不同。 這份檔列出 WinMD 檔案和 CLR 元件之間的差異。

系統提供的 WinMD 檔案是純中繼資料。 協力廠商 WinMD 檔案可能包含程式碼。 尤其是,managed WinMD 檔案包含 Microsoft 中繼語言 (MSIL) 程式碼,就像傳統的 CLR 元件一樣。

每個 WinMD 檔案都包含零或多個 WinRT 類型的定義。 空的 WinMD 檔案在技術上是有效的。

WinMD 中所列的 PEKind 或機器架構沒有特定的 WinRT 限制。

WinMD 版本字串必須包含 "Windows 執行階段 1.2"。

WinMD 檔案名

WinMD 檔案沒有副檔名) 的 (名稱,必須與 WinMD 檔案內元件資料表的 name 資料行不區分大小寫。 例如,在元件資料表的 [名稱] 資料行中,"Foo. winmd" 檔案必須有 "Foo.Bar"。 由於檔案系統不區分大小寫,因此檔案名的大小寫可能與 [assembly table name] 資料行的值不同。

給定 WinMD 檔案中的所有 WinRT 型別,都必須在符合 WinMD 檔案名稱和 assembly table name 資料行值的命名空間下。 由於檔案系統不區分大小寫,因此檔案名的大小寫可能會與指定的 WinMD 檔案中所有 WinRT 類型的命名空間不同。 給定 WinMD 中所有 WinRT 型別的命名空間必須完全符合元件資料表名稱資料行值 (也就是區分大小寫) 。 例如,在元件資料表名稱資料行中具有 "Foo.Bar" 的檔案中的所有類型都必須在 "Foo.Bar" 命名空間中。 這些類型可以是此命名空間的直接子系 (例如 Foo. MyType) ,或這個命名空間的子命名空間 (例如 Foo. Baz. MyType) 。 檔案的名稱必須是 "Foo",但大小寫可能會不同,也就是 "foo" 和 "FOO"。酒吧。WINMD」也可做為這個中繼資料檔案的檔案名。

WinMD 組合

系統中所有類型的中繼資料會散佈在多個 winmd 檔案中。 AppX 套件可以包含零或多個 winmd 檔案,以描述應用程式封裝中包含的協力廠商 WinRT 元件。

在系統提供的所有 winmd 檔案中,或包含在指定的應用程式中,每個 WinRT 類型的中繼資料都必須儲存在 WinMD 檔案中,且名稱最長可符合該類型的命名空間。 屬於指定命名空間之直接子系的所有型別,都必須位於相同的檔案中。 例如,如果 AppX 封裝包含 Foo 和 Foo 檔案,則 Foo. Baz. MyType 類型必須位於 Foo 檔案中,因為這是封裝中類型的命名空間比對檔案名最長的檔案,所以必須位於 Foo 檔案中。

TypeDef 重新導向

系統所提供的中繼資料檔案絕不會直接參考 Typedef。 即使參考相同中繼資料檔案中所定義的型別,系統中繼資料檔案一律會參考下的 TypeRef,進而參考 TypeDef。 這樣做的目的是為了支援 CLR 型別重新導向 (將IVector < t >投射為IList < t >,例如) 。

協力廠商中繼資料檔案可能會直接使用 TypeDef,或可透過 TypeRef 將所有類型參考重新導向,類似于系統中繼資料檔案的用途。

類型系統編碼

這份檔中來自 mscorlib.dll 元件之 System 命名空間的所有型別,都是用來當做 WinRT 的標記。 這些類型用來指出型別的相關資訊,而且永遠不會解決。 這包括 (但不限於) System.object、MulticastDelegate、system.object、system.string、system..... a m. Attribute。 請注意,這些名稱是為了與 CLR 相容而選擇的。 這些類型的 CLR 定義是其型別系統的一部分,而且與 WinRT 沒有任何作用。

請注意,此處所述的許多結構都使用 c # 語法。 這只是因為使用 c # 語法來表示特定的通用語言基礎結構 (CLI) 元資料結構很方便。 實際的結構是純 CLI 元資料結構。

命名空間

WinRT 以單一句點分隔的字串編碼類型的命名空間和本機名稱。 例如,在這段程式碼中定義的類型是 "Windows。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 會在中繼資料中以 TypeRef 表示,並從 mscorlib 元件以 TypeRef 表示。

列舉

列舉會以 TypeDef 資料表中的資料列來表示 (ECMA 22.37) ,而且資料行的設定如下。

  • 標誌。 設定為公用 |Sealed |tdWindowsRuntime (0x4101) 。
  • Name: 包含型別名稱的字串堆積索引。
  • 命名空間。 包含型別命名空間之字串堆積的索引。
  • 延伸。 設定為在 mscorlib.dll 元件中參考 system.string 類別的 TypeRef。
  • FieldList. 欄位資料表中的索引,標記此型別所擁有之連續執列欄位的第一個。
  • MethodList. 必須是空的。

列舉具有單一實例欄位,可指定列舉的基礎整數類型,以及零或多個靜態欄位;列舉類型所定義的每個列舉值都有一個。

列舉的基礎整數類型會顯示為欄位資料表中的第一個資料列, (ECMA 22.15) 與類型相關聯 (也就是在上述指定的 FieldList 資料行中所參考的資料列) 。 列舉類型之欄位資料表中的資料行如下所示。

  • 旗標:私用 |SpecialName |RTSpecialName (0x601) 。
  • 名稱:包含名稱 "value__" 的字串堆積索引。
  • 簽章: blob 堆積中的索引,其中包含 FieldSig blob (ECMA II. 23.2.4) 其中的型別設定為 ELEMENT_TYPE_I4 或 ELEMENT_TYPE_U4,因為 WinRT 列舉值必須是帶正負號或不帶正負號的32位整數。

列舉值定義在列舉中的每個值都有欄位定義之後。

  • 旗標:公用 |靜態 |常值 |hasdefault (0x8056) 。
  • 名稱:包含列舉值之名稱的字串堆積索引。
  • 簽章: blob 堆積中的索引,其中包含 FieldSig blob (ECMA II. 23.3.4) ,並將類型設為列舉類型的 TypeDef。

針對每個列舉值定義,常數資料表中都會有對應的資料列 (ECMA 22.9) 來儲存列舉值的整數值。

  • 輸入 。 一個位元組表示列舉的基礎類型(ELEMENT_TYPE_I4 或 ELEMENT_TYPE_U4),後面接著一個位元組填補(依 ECMA 規格而零)。
  • Parent:在保留相關列舉值記錄的欄位資料表中的索引。
  • 值:在 blob 資料表中保存列舉值之整數值的索引。

此外,您必須將 FlagsAttribute 的列舉 TypeDef 資料列新增至具有基礎 UInt32 型別的任何列舉。 FlagsAttribute 不可加入至具有基礎 Int32 類型之列舉的列舉 TypeDef 資料列。

針對所有系統提供的列舉,必須將 VersionAttribute 新增至列舉 TypeDef 資料列。 (選擇性) VersionAttribute 可以加入至任何靜態欄位資料列。 如果有的話,任何列舉欄位資料列上 VersionAttribute 的版本值都必須大於或等於列舉 TypeDef 資料列上 VersionAttribute 的值。

結構

結構會實作為 TypeDef 資料表中的資料列, (ECMA II. 22.37) ,其中的資料行設定如下。

  • 旗標-公用 |Sealed |連續 |tdWindowsRuntime (0x4109) 。
  • 名稱–包含型別名稱的字串堆積索引。
  • Namespace –包含型別命名空間的字串堆積索引。
  • 擴充–設定為在 mscorlib.dll 元件中參考 system.string 類別的 TypeRef。
  • FieldList –欄位資料表中的索引,標記此型別所擁有之連續執列欄位的第一個。
  • MethodList –必須是空的。

結構有一或多個欄位資料表專案。

  • 旗標: public。
  • 名稱:包含欄位名稱的字串堆積索引。
  • 簽章: blob 堆積中的索引,其中包含 FieldSig blob (ECMA II. 23.2.4) ,並將類型設定為欄位類型的元資料標記。
    • 結構欄位必須是基本類型、列舉或其他結構。

針對所有系統提供的結構,VersionAttribute 必須加入至結構 TypeDef 資料列。

委派

委派會實作為 TypeDef 資料表中的資料列 (ECMA 22.37) ,而且資料行設定如下。

  • 旗標:設定為公用 |Sealed |tdWindowsRuntime (0x4101) 。
  • 名稱–包含型別名稱的字串堆積索引。
  • Namespace –包含型別命名空間的字串堆積索引。
  • 擴充:設定為可參考 mscorlib.dll 元件中 MulticastDelegate 類別的 TypeRef。
  • FieldList:必須是空的。
  • MethodList:在 MethodDef 資料表中的索引 (ECMA II. 22.26) ,標記此型別所擁有之連續執行方法的第一個。

委派的 TypeDef 資料列必須有 GuidAttribute。

委派正好有兩個 MethodDef 資料表專案。 第一個定義一個函式。 這個函式是相容性標記,這就是為什麼它會使用非 WinRT 的結構(例如原生 int),以及不屬於 inout 的參數。 WinRT 委派沒有這類的方法。

  • RVA: 0 (這是抽象結構) 。
  • ImplFlags: runtime (0x03) 。
  • 旗標:私用 |hidebysig |specialname |RTSpecialName (0x1881) 。
  • 名稱:包含名稱 ".ctor" 之字串資料表中的索引。
  • 簽章: blob 堆積中的索引,其中包含 MethodDefSig blob (ECMA II. 23.2.1) 適用于具有物件和原生 int in 參數且沒有傳回值的方法。
  • ParamList: Param 資料表中的索引 (ECMA II. 22.33) ,其中包含與這個方法相關聯的 Param 資料列中的第一個。 Param 資料表中的每個資料列都包含下列資訊。
    • 物件參數
      • 順序1
      • Name "object"
      • 旗標:無 (0x00)
    • 原生 Int 參數
      • 順序2
      • Name "method"
      • 旗標:無 (0x00)

第二個 MethodDef 專案會定義 Invoke 方法。

  • RVA: 0 (這是抽象結構)
  • ImplFlags: runtime (0x03)
  • 旗標:公用 |虛擬 |HideBySig |specialname (0x08C6)
  • 名稱:字串資料表中包含 "Invoke" 名稱的索引
  • 簽章: blob 堆積中的索引,其中包含 MethodDefSig blob (ECMA II. 23.2.1) ,其中包含委派的參數類型和傳回型別。 如果委派已參數化,則 MethodDefSig blob 應該透過 GENERICINST 編碼類型來參考每個委派型別參數 (如每個 ECMA II. 23.2.12) 。 要遵循之參數化委派的詳細資料。
  • ParamList: Param 資料表中的索引 (ECMA II. 22.33) ,其中包含與這個方法相關聯的 Param 資料列中的第一個。 Param 資料表中的每個資料列都會包含下列資訊。
    • 旗標-in 或 out 適用于參數
    • Sequence –參數的順序順序。 為方法的傳回值保留零
    • 名稱–在字串堆積中包含所有系統提供的委派之參數名稱的索引,必須將 VersionAttribute 加入委派的 TypeDef 資料列。

參數化委派

參數化委派有下列額外的需求。

  • 參數化委派的名稱會附加倒引號,以及代表參數化委派所擁有之類型參數數目的數位。 例如,Windows。EventHandler < T > type 會儲存在名稱 Windows 的中繼資料中。EventHandler ' 1。
  • 參數化委派在 GenericParam 資料表中有一個資料列 (ECMA II. 22.20) 的資料行設定為每個類型參數,如下所示。
    • Number:泛型參數的索引,由左至右編號,從零開始。
    • 旗標:無。
    • 擁有者:包含介面之資料列的 TypeDef 資料表索引。
    • Name:包含泛型參數名稱之字串堆積中的索引。

TypeSpec 資料表 (ECMA II. 23.2.14) 用來定義參數化委派的實例。 然後,這些則可以在類似 TypeRefs 的方法簽章中使用。

介面

介面會實作為 TypeDef 資料表中的資料列, (ECMA II. 22.37) ,其中的資料行設定如下。

  • 旗標:
    • 介面 |公用 |abstract |tdWindowsRuntime (0x40A1) ,或
    • 介面 |NotPublic |abstract |tdWindowsRuntime (0x40A0)
  • 名稱:包含介面名稱之字串資料表中的索引。
  • Namespace –包含型別命名空間的字串堆積索引。
  • 擴充: null。
  • FieldList:必須是空的。
  • MethodList:在 MethodDef 資料表中的索引,標記此型別所擁有之連續執行方法的第一個。 有關 MethodDef 資料表內容的詳細資訊詳述于目前章節的小節中。

介面的 TypeDef 資料列必須具有 GuidAttribute 和 VersionAttribute。

具有私用可見度的任何 WinRT 介面都必須有單一 ExclusiveToAttribute。 具有公用可見度的任何 WinRT 介面都不能有 ExclusiveToAttribute。 如果有的話,ExclusiveToAttribute 必須參考執行時間類別。

介面的必要介面會以 InterfaceImpl 資料表中的資料清單示 (ECMA II. 22.23) ,其中的資料行設定如下。

  • 類別:包含介面之資料列的 TypeDef 資料表索引。
  • 介面:指定必要介面之 TypeDef、TypeRef 或 TypeSpec 資料表中的索引。 請注意,在系統提供的中繼資料檔案中,即使在相同的中繼資料檔案中定義必要的介面,這也永遠不會是 TypeDef。 如需進一步的詳細資料,請參閱 TypeDef 重新導向一節。

參數化介面

參數化介面符合下列其他需求。

參數化介面的名稱會附加倒引號,以及代表參數化委派所擁有之類型參數數目的數位。 例如,Windows。IVector < T > type 會儲存在名稱 Windows 的中繼資料中。IVector ' 1。

參數化介面在 GenericParam 資料表中有一個資料列 (ECMA II. 22.20) 針對每個類型參數,資料行設定如下。

  • Number:泛型參數的索引,由左至右編號,從零開始。
  • 旗標:無。
  • 擁有者:包含介面之資料列的 TypeDef 資料表索引。
  • Name:包含泛型參數名稱之字串堆積中的索引。

TypeSpec 資料表 (ECMA II. 23.2.14) 用來定義參數化介面的實例。 然後,這些則可用於方法簽章和介面執行,類似于 TypeRefs。

介面成員

陣列參數

針對任何介面成員類型編碼陣列參數時,MethodDefSig blob 以及 params 資料表都會省略緊接在陣列參數之前的陣列長度參數。

陣列參數的方向是直接以中繼資料編碼。 陣列長度參數的方向可能會以下列方式推斷。

  • 如果陣列參數是 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
  • 旗標:公用 |虛擬 |HideBySig |Abstract |NewSlot |實例 (0x5c6)
  • 名稱:包含方法名稱的字串資料表索引
  • 簽章: blob 堆積中的索引,其中包含 MethodDefSig blob (ECMA II. 23.2.1) ,其中包含方法的參數類型和傳回型別。 如果介面已參數化,則 MethodDefSig blob 應該透過 GENERICINST 編碼類型來參考每個介面的類型參數 (如每個 ECMA II. 23.2.12) 。 要遵循的參數化介面詳細資料。
  • ParamList: Param 資料表中的索引 (ECMA II. 22.33) ,其中包含與這個方法相關聯的 Param 資料列中的第一個。

方法的每個參數 (加上傳回值(如果指定的話)) 會在 Param 資料表中有對應的資料列 (ECMA 22.33) 。

  • 旗標– none、in 或 out (適用于參數)。
    • 傳回值一律為 none
    • 其他參數一律為 in 或 out
  • Sequence –參數的順序順序。
    • 為方法的傳回值保留零
  • 名稱–包含參數名稱之字串堆積中的索引。

每個方法都可以選擇性地使用 OverloadAttribute,在介面) 範圍內攜帶唯一方法名稱 (。 每個方法可能會選擇性地有一個 Windows.foundation.metadata.defaultoverloadattribute 裝飾,指出相同 arity (數目) 應以弱式動態類型的語言來投射的多載方法。

屬性

介面上的每個屬性都會定義為屬性中的資料列 (ECMA II. 22.34) 、System.windows.forms.integration.propertymap.add (ECMA II. 22.35) 、MethodSemantics (ECMA II. 22.28) 和 MethodDef (ECMA II. 22.26) 資料表。

具有一或多個屬性的每個介面都會以包含下列資訊的 System.windows.forms.integration.propertymap.add 資料表中的單一資料列來表示。

  • Parent:包含包含屬性之介面的 TypeDef 資料表索引。
  • PropertyList:屬性資料表中的索引,其中包含與這個類型相關聯之資料列中的第一個。

每個屬性都會以包含下列資訊的屬性資料表中的單一資料列來表示:

  • 旗標:無。
  • 名稱:包含屬性名稱的字串堆積索引。
  • 類型:包含 PropertySig blob 的 blob 堆積中的索引 (ECMA II. 23.2.5) 包含屬性的類型資訊。

每個屬性都會表示為 MethodDef 資料表中的一或兩個數據列。 唯讀屬性會表示為具有 "get_" 前置詞的單一方法,而讀取/寫入屬性則會表示為兩個方法,一個使用 "get_",另一個則使用 "put_" 前置詞。 Get 方法的簽章不接受任何參數,而且會傳回屬性類型的值。 Set 方法的簽章會接受屬性型別的單一參數,而不會傳回任何內容。

屬性的 MethodDef 資料列包含下列內容。

  • RVA:0
  • ImplFlags:無
  • 旗標:公用 |虛擬 |HideBySig |newSlot |abstract |specialname (0xDC6)
  • 名稱:字串資料表中的索引,其中包含適當的 "get_ < propertyname > " 或 "put_ < PropertyName > "
  • 簽章: blob 堆積中的索引,其中包含 MethodDefSig blob (ECMA II. 23.2.1) ,其中包含方法的參數類型和傳回類型(如上所述)。
  • ParamList: Param 資料表中的索引 (ECMA II. 22.33) ,其中包含與這個方法相關聯的 Param 資料列中的第一個。 Param 資料表中的值會依照上述方法來指定。

屬性的每個 MethodDef 資料列在 MethodSemantics 資料表中都會有相關聯的資料列,其中包含下列資訊。

  • 語義:適當的 Getter 或 Setter。
  • 方法:在包含 getter 或 setter 方法的 MethodDef 資料表中建立索引。
  • Association:包含屬性之屬性資料表的索引。

事件

介面上的每個事件都會定義為事件中的資料列 (ECMA II. 22.13) 、EventMap (ECMA II. 22.12) 、MethodSemantics (ECMA II. 22.28) 和 MethodDef (ECMA II. 22.26) 資料表。

具有一或多個事件的每個介面都會以包含下列資訊的 EventMap 資料表中的單一資料列來表示。

  • Parent:包含包含屬性之介面的 TypeDef 資料表索引。
  • EventList:事件資料表中的索引,其中包含與這個類型相關聯之資料列中的第一個。

每個事件都會以包含下列資訊的事件資料表中的單一資料列來表示。

  • EventFlags: None。
  • 名稱:包含屬性名稱的字串堆積索引。
  • 事件種類: TypeDefOrRef,它會在包含事件之委派類型的適當資料表中進行索引。

每個事件都會以 MethodDef 資料表中的兩個數據清單示,一個包含用於加入事件接聽程式的 "add_" 前置詞,另一個則使用 "remove_" 前置詞來移除事件接聽程式。 Add 方法會接受委派實例,並傳回 Windows。EventRegistrationToken,代表事件註冊。 Remove 方法會採用 add 方法所傳回的 EventRegistrationToken 來取消註冊事件。

事件的 MethodDef 資料列包含下列專案。

  • RVA:0
  • ImplFlags:無
  • 旗標:公用 |最終 |虛擬 |hidebysig |newslot |specialname (0x09e6)
  • 名稱:字串資料表中的索引,其中包含適當的 "add_ < propertyname > " 或 "remove_ < PropertyName > "。
  • 簽章: blob 堆積中的索引,其中包含 MethodDefSig blob (ECMA II. 23.2.1) ,其中包含方法的參數和傳回類型,如下所述。
    • Add_ 方法會接受委派類型的單一參數,並傳回 Windows。EventRegistrationToken。
    • Remove_ 方法會採用單一 Windows。EventRegistrationToken 參數且不會傳回任何專案。
  • ParamList: Param 資料表中的索引 (ECMA II. 22.33) ,其中包含與方法相關聯的 Param 資料列中的第一個。 Param 資料表中的值會依照上述方法來指定。

事件的兩個 MethodDef 資料列在 MethodSemantics 資料表中會有相關聯的資料列,其中包含下列資訊。

  • 語義:適當的附加元件或 RemoveOn。
  • 方法:在包含加入或移除接聽程式方法的 MethodDef 資料表中建立索引。
  • Association:包含事件之事件資料表的索引。

執行階段類別

執行時間類別會實作為 TypeDef 資料表中的資料列, (ECMA II. 22.37) ,其中的資料行設定如下。

  • 旗標:所有執行時間類別都必須包含 public、auto layout、class 和 tdWindowsRuntime 旗標。
    • 靜態類別具有抽象旗標。 所有其他類別都不會包含抽象旗標。
    • 不可組合的類別會攜帶密封旗標。 可組合的類別不會包含密封旗標。
  • 名稱:包含類別名稱之字串資料表中的索引。
  • Namespace –包含型別命名空間的字串堆積索引。
  • 擴充:在 TypeRef 中參考可組合類別或 System.object 的 TypeRef。
  • FieldList:必須是空的。
  • MethodList:在 MethodDef 資料表中的索引,標記此型別所擁有之連續執行方法的第一個。 以下詳述 MethodDef 資料表內容的詳細資訊。

針對所有系統提供的類別,VersionAttribute 必須加入至類別的 TypeDef 資料列。

實作為介面

由執行時間類別所執行的介面會以 InterfaceImpl 資料表中的資料清單示 (ECMA II. 22.23) ,其中的資料行設定如下。

  • 類別:包含此類型之資料列的 TypeDef 資料表索引。
  • 介面:指定實介面之 TypeDef、TypeRef 或 TypeSpec 資料表的索引。 請注意,在系統提供的中繼資料檔案中,即使在相同的中繼資料檔案中定義必要的介面,這也永遠不會是 TypeDef。 如需進一步的詳細資料,請參閱 TypeDef 重新導向一節。

執行時間類別必須只在其中一個 InterfaceImpl 資料列上指定 Attribute。

執行時間類別可以指定其任何 InterfaceImpl 資料列的 OverridableAttribute 或 ProtectedAttribute。 它們可能不會在同一個資料列上同時指定 OverridableAttribute 和 ProtectedAttribute。

您可以選擇性地將 VersionAttribute 新增至任何類別的 interfaceImpl 資料列。 在任何類別的 interfaceImpl 資料列上,VersionAttribute 的版本值必須大於或等於類別的 TypeDef 資料列上的 VersionAttribute 值。

靜態介面

執行時間類別有零或多個 StaticAttribute 自訂屬性。 指定一個以上的 StaticAttribute 自訂屬性是合法的,只要每個屬性都有不同的指定參數即可。 任何 StaticAttribute 都會在 CustomAttribute 資料表中顯示為數據列,其中包含下列資訊。

  • Parent:與 StaticAttribute 相關聯的執行時間類別。
  • Type: StaticAttribute 的 .ctor 參考。
  • 值:包含 system.string 靜態介面參數和 Uint32 version 參數的自訂屬性 blob。

啟用

執行時間類別有零或多個 ActivatableAttribute 自訂屬性。 指定一個以上的 ActivatableAttribute 自訂屬性是合法的,只要每個屬性都有不同的指定參數即可。 任何 ActivatableAttributes 都會在 CustomAttribute 資料表中顯示為數據列,其中包含下列資訊。

  • Parent:與 ActivatableAttribute 相關聯的執行時間類別。
  • 類型: ActivatableAttribute 的其中一個 ctor 的參考。
    • 直接啟用:只接受 Uint32 版本參數的 .ctor。
    • Factory 啟用:採用 system.string factory 介面參數和 Uint32 version 參數的 .ctor。
  • 值:包含 system.string factory 介面參數的自訂屬性 blob, (如有提供) 和 Uint32 版本參數。

Composition

執行時間類別有零或多個 ComposableAttribute 自訂屬性。 指定一個以上的 ComposableAttribute 自訂屬性是合法的,只要每個屬性都有不同的指定參數即可。 任何 ComposableAttribute 都會在 CustomAttribute 資料表中顯示為數據列,其中包含下列資訊。

  • Parent:與 ComposableAttribute 相關聯的執行時間類別。
  • Type: ComposableAttribute 的 .ctor 參考。
  • 值:包含 system.string 的自訂屬性 blob 介面介面參數、CompositionType 的列舉值 (Public 或 Protected) 和 Uint32 version 參數。

類別方法

在每個與類別相關聯的介面上,執行時間類別在 MethodDef 資料表中都有一個資料列。 這包括成員介面 (正常、受保護和可覆寫的) 、靜態介面、啟用處理站介面,以及可組合的 factory 介面。 此外,支援直接啟用的類別在 MethodDef 資料表中也會有一個資料列來指出這一點。

成員介面成員

成員介面中的每個方法 (包括受保護和可覆寫的介面) 都會以類別的 MethodDef 資料表中的資料列來表示。 類別的 methodDef 資料表包含來自原始宣告介面(包括 Param 資料表資料列和自訂屬性)的 MethodDef 資訊完整複本,但有下列例外狀況。

  • 執行時間類別可為成員介面上定義的方法指定替代名稱。
  • 執行時間類別上的方法不會取得抽象旗標。
  • 執行時間類別上的方法會取得執行時間 MethodImpl 旗標。
  • 不可覆寫介面中的方法會另外取得最後一個旗標。 來自可覆寫介面的方法不會取得最終旗標。

成員介面之類別的 MethodDef 資料表中的每個資料列都會連接回介面方法,該方法原本是透過 MethodImpl 資料表中的專案來定義方法 (ECMA II. 22.27) 的值如下所示。

  • 類別-在 TypeDef 資料表中參考攜帶方法之類別的索引 (注意,此索引不受 TypeDef 重新導向) 的制約。
  • MethodBody –參考類別方法的 MethodDef 資料表索引。
  • MethodDeclaration –參考原始宣告介面方法之 MethodDef 或 MemberRef 資料表中的索引。
靜態介面成員

靜態介面中的每個方法都會以類別的 MethodDef 資料表中的資料列來表示。 類別的 methodDef 資料表包含來自原始宣告介面(包括 Param 資料表資料列和自訂屬性)的 MethodDef 資訊完整複本,但有下列例外狀況。

  • 靜態成員不會取得虛擬、抽象、NewSlot 和實例旗標。
  • 靜態成員確實會取得靜態和類別旗標。
  • 執行時間類別上的靜態方法會取得執行時間 MethodImpl 旗標。
啟用成員

支援直接、無參數啟用的類別,在類別的 MethodDef 資料表中有一個具有下列資料行值的函式資料列。

  • RVA:0x00
  • ImplFlags: Runtime
  • 旗標:公用 |HideBySig |SpecialName |RTSpecialName |實例
  • Name:字串資料表中包含 ".ctor" 的索引
  • 簽章: blob 堆積中的索引,其中包含 MethodDefSig blob (ECMA II. 23.2.1) ,其中不包含任何參數,且會傳回 null
  • ParamList:必須是空的

支援 factory 啟用的類別具有類別的 MethodDef 資料表中的一個函式資料列,適用于每個已執行的 factory 介面中具有下列資料行值的方法。

  • RVA:0x00
  • ImplFlags: Runtime
  • 旗標:公用 |HideBySig |SpecialName |RTSpecialName |實例
  • Name:包含 ".ctor" 的字串資料表中的索引。
  • 簽章: blob 堆積中的索引,其中包含 MethodDefSig blob (ECMA II. 23.2.1) ,其中包含輸入參數並傳回 null。
  • ParamList:在 Params 資料表中,每個參數都有一個資料列的指標,從原始宣告 factory 方法的參數資料表中完全複製。
組合成員

支援組合 factory 啟用的類別具有類別的 MethodDef 資料表中的一個函式資料列,適用于每個實廠介面中具有下列資料行值的方法。

  • RVA:0x00
  • ImplFlags: Runtime
  • 旗標:公用 |HideBySig |SpecialName |RTSpecialName |實例
  • Name:包含 ".ctor" 的字串資料表中的索引。
  • 簽章: blob 堆積中的索引,其中包含 MethodDefSig blob (ECMA II. 23.2.1) ,其中包含自訂輸入參數,並且會傳回 null。 控制 IInspectable * [in] 參數和非委派 IInspectable * * [out] 參數不會反映在方法簽章中。
  • ParamList:在 Params 資料表中,每個參數都有一個資料列的指標,但控制 IInspectable * [in] 參數和非委派的 IInspectable * * [out] 參數,會從原始宣告處理站方法的 Params 資料表中完全複製。

自訂屬性

自訂屬性有零或多個函式方法,每個方法都有零或多個參數,其中參數類型會限制為基本類型、列舉和 System.object。 自訂屬性中的每個函式都會在 MethodDef 中顯示為包含下列資訊的資料列。

  • RVA (也稱為相對虛擬位址) : null
  • ImplFlags:無
  • 旗標:公用 |HideBySig |specalname |0x1886) 的 RTSpecialName (
  • 名稱:包含名稱 ".ctor" 之字串資料表中的索引。
  • 簽章: blob 堆積中的索引,其中包含 MethodDefSig blob (ECMA II. 23.2.1) ,其中包含方法的參數類型和傳回型別。
  • ParamList: Param 資料表中的索引 (ECMA II. 22.33) ,其中包含與這個方法相關聯的 Param 資料列中的第一個。

元資料結構上的自訂屬性會儲存為 CustomAttribute 資料表中的資料列 (ECMA II. 22.10) ,其中的資料行設定如下。

  • Parent:將自訂屬性附加至中繼資料資料表的索引。
  • Type:在 MethodDef 或 MemberRef 資料表中的索引,其中包含屬性類型的函式參考。
  • 值:在包含位置和命名屬性參數之 blob 堆積中的索引, (ECMA 23.2) 。 請注意,由於 WinRT 自訂屬性不允許有屬性,因此自訂屬性 blob 永遠不會包含具名引數的屬性樣式。