共用方式為


中繼資料語彙基元概觀

更新:2007 年 11 月

中繼資料會參考包括執行階段型別 (類別、實值型別和介面)、全域函式和全域變數等抽象的宣告式資訊。中繼資料儲存在資料表中,每個抽象分類一個資料表,而且每個抽象宣告一個資料表資料列。語彙基元 (型別 mdToken 的物件) 是用來尋找包含抽象中繼資料的記錄。中繼資料引擎會使用語彙基元在指定之中繼資料範圍的特定中繼資料表中索引。

中繼資料語彙基元結構

中繼資料語彙基元為 4 位元組的值。最大顯著性位元組 (Most Significant Byte,MSB) 會指定語彙基元型別,因此會識別抽象及其關聯的中繼資料表。例如,MSB 的值為 1 表示此語彙基元為 mdTypeRef 語彙基元 (表示型別參考),而且其中繼資料儲存在 TypeRef 中繼資料表。MSB 的值為 4 則對應至 mdFieldDef 語彙基元。可使用 CorTokenType 列舉型別指定語彙基元型別。

較低的三個位元組稱為「記錄識別項」(RID),包含語彙基元的 MSB 所參考之中繼資料表中的資料列索引。例如,值為 0x02000007 的中繼資料語彙基元會參考目前範圍中 TypeDef 資料表的資料列 7。同樣地,語彙基元 0x0400001A 會參考目前範圍中 FieldDef 資料表的資料列 26 (十進位)。中繼資料表的資料列零絕不包含資料,所以 RID 為零的中繼資料語彙基元稱為「Nil 語彙基元」。中繼資料 API 定義許多這類 Nil 語彙基元,每個語彙基元型別一個 Nil 語彙基元,例如值為 0x01000000 的 mdTypeRefNil

注意事項:

上述 RID 的說明是概念性的,實際上,中繼資料的實體配置更為複雜。此外,字串語彙基元 (mdString) 有點不同,較低的三個位元組不是記錄識別項,而是表示中繼資料字串集區中字串開始位置的位移。

使用中繼資料語彙基元

中繼資料 API 中的每個 DefineXXX 方法都會傳回語彙基元,可將其傳遞至 GetXXX 方法以取得相關屬性。

中繼資料語彙基元是在範圍中定義的。例如,值為 N 的中繼資料語彙基元,會在指定的範圍中完全識別包含型別定義詳細資料的記錄。不過,在不同的範圍中,具有此相同值 N 的中繼資料語彙基元可能會指定完全不同的記錄。

中繼資料語彙基元並非不變的中繼資料物件識別項。當合併兩個範圍時,來自匯入之範圍的語彙基元會重新對應至發出之範圍的語彙基元。當儲存中繼資料範圍時,各種格式最佳化可能會導致語彙基元重新對應。

語彙基元型別

下表列出中繼資料語彙基元型別、每個語彙基元型別表示的抽象,以及包含抽象中繼資料的中繼資料表名稱。所有語彙基元型別都是基本語彙基元型別 mdToken 的變化。

語彙基元型別

中繼資料表

抽象

mdModule

模組

模組:編譯單位 (Compilation Unit)、可執行檔或其他開發單位、執行階段單位。可能可以 (但不是必要) 視為整體在模組上宣告屬性,包括名稱、GUID、自訂屬性等。

mdModuleRef

ModuleRef

模組參考:模組的編譯時期參考,記錄型別和成員匯入的來源。

mdTypeDef

TypeDef

型別宣告:執行階段參考型別 (類別或介面) 或實值型別的宣告。

mdTypeRef

TypeRef

型別參考:執行階段參考型別或實值型別的參考。因此,模組中的型別參考集合是編譯時期匯入相依項的集合。

mdMethodDef

MethodDef

模組定義:當做類別或介面的成員,或當做全域模組層級方法的方法定義。

mdParamDef

ParamDef

參數宣告:儲存參數其他中繼資料之選擇性資料結構的定義。不需要針對方法中的每個參數發出資料結構。不過,當參數有要保存的其他中繼資料時,例如封送處理或型別對應資訊,則可以建立選擇性的參數資料結構。

mdFieldDef

FieldDef

欄位宣告:當做類別或介面之資料成員的變數宣告,或全域、模組層級變數的宣告。

mdProperty

屬性

屬性宣告:當做類別或介面的成員之屬性宣告。

mdEvent

事件

事件宣告:當做類別或介面的成員之具名事件宣告。

mdMemberRef

MemberRef

成員參考:方法或欄位的參考。針對目前模組中,由任何實作所執行的每個方法引動過程或欄位存取,都會在中繼資料中產生成員參考,而且會在 Microsoft Intermediate Language (MSIL) 資料流中保存語彙基元。沒有屬性或事件參考的執行階段支援。

mdIfaceImpl

IfaceImpl

介面實作:特定類別的特定介面實作。此中繼資料抽象可以儲存既非類別又非介面的特定交集資訊。

mdMethodImpl

MethodImpl

方法實作:特定類別的方法實作,這個方法是透過介面繼承而繼承的。這個中繼資料抽象可以保留資訊,這些資訊是實作 (而非合約) 的特定資訊。實作的類別無法修改方法宣告資訊。

mdCustomAttribute

CustomAttribute

自訂屬性:與可透過 mdToken 所參考之任何中繼資料物件關聯的任意資料結構 (例外為自訂屬性本身不能有自訂屬性)。

mdPermission

使用權限

使用權限集合:與 mdTypeDefmdMethodDefmdAssembly 關聯的宣告式安全性使用權限集合。如需詳細資訊,請參閱加入宣告式安全性支援

mdTypeSpec

TypeSpec

型別建構函式:取得型別 (例如 Boxed 實值型別) 的語彙基元,以做為任何接受型別之 MSIL 指令的輸入的方法。

mdSignature

Signature

獨立簽章:可攜式執行檔 (PE) 中的區域變數簽章或傳遞至 MSIL 指令的方法簽章。

mdString

字串

使用者字串:傳遞至 MSIL 指令的字串。

注意事項:

上述清單不包含兩個不同的語彙基元型別,如您所預期,一個是欄位參考的語彙基元,另一個是方法參考的語彙基元。欄位和方法參考會共用相同的資料表,而且可以透過語彙型別 mdMemberRef 來參考它們。

擴充性和抽象

執行階段中繼資料是可擴充的,這在下列案例中很重要:

  • 為了表示 Common Language Specification (CLS) 所定義的條件約束或高階抽象。CLS 是語言和工具為達成更佳語言整合而一致支援的慣例規格。CLS 可能會限制一般型別系統模型的某些部分,而且 CLS 可能會在一般型別系統之上引入高階抽象層。即使執行階段不會明確辨識或支援這些抽象,中繼資料還是必須能夠擷取工具所使用的這些開發時期抽象型別。

  • 為了表示不是一般型別系統的一部分並且不是 CLS 抽象的語言特定抽象。這可讓 Visual C 之類的語言不需要個別標頭檔或 IDL 檔案,即可使用已編譯之模組所匯出的型別、方法和資料成員。

  • 為了編碼成員中的簽章型別和型別修飾詞 (為特定語言多載所使用)。

中繼資料擴充性有下列形式:

  • 每個中繼資料物件都可以支援自訂屬性,而且中繼資料 API 提供方法來宣告、列舉和擷取自訂屬性。自訂屬性可透過型別參考 (mdTypeDefmdTypeRef) 來識別。自訂屬性的結構是透過型別上所宣告的資料成員自我描述的,而且值編碼可透過任何工具 (包括執行階段反映服務) 瀏覽。

  • 除了擴充一般型別系統之外,還可能將自訂修飾詞發出至成員簽章。執行階段會針對方法多載、隱藏和繫結接受這些修飾詞,但不會強制任何語言特定的語意。

請參閱

其他資源

中繼資料概觀