中繼資料概觀
中繼資料是用來描述執行階段型別 (類別、介面和實值型別)、欄位和方法,以及供 Common Language Runtime (CLR) 使用的內部實作和配置資訊。 執行階段會使用中繼資料來 JIT 編譯 Microsoft Intermediate Language (MSIL)、載入類別、執行程式碼和與 COM 一般或原生世界進行交互操作。 中繼資料包含在每個 CLR 元件,並且可用於執行階段、工具和服務。
本概觀包含下列各節:
中繼資料 API
與反映服務的比較
範圍
錯誤檢查
相關主題
中繼資料 API
中繼資料的所有操作都是透過中繼資料 API 執行,此中繼資料 API 會將用戶端 (工具和服務) 與基礎資料結構隔絕。 中繼資料 API 提供可插式保存性格式架構,能夠讓執行階段二進位表示法、COM 一般型別程式庫和其他格式無障礙地在記憶體上來回傳送。
中繼資料 API 包含會發出 (即產生) 和匯入中繼資料的介面。 用戶端可以透過下列方式發出或匯入中繼資料:
編譯器和工具藉由呼叫發出 API 來發出中繼資料。 中繼資料是在編譯和連結程序期間發出的。 RAD 工具會在建置元件或應用程式程序中發出中繼資料。 API 成員會寫入和讀取記憶體中的資料結構。 在儲存時,這些記憶體中的結構會經過壓縮並且以二進位格式保存至目標編譯單位 (.obj 檔案)、可執行檔 (.exe) 或獨立中繼資料二進位檔中。 從 EXE 或 DLL 連結至多個編譯單位時,發出 API 成員會提供一個方法,將每個編譯單位的中繼資料區段合併成一個整合式中繼資料二進位檔。
載入器和其他執行階段工具和服務藉由呼叫 API 成員來匯入中繼資料,取得元件的相關資訊,以便完成載入和啟動等工作。
回到頁首
與反映服務的比較
中繼資料 API 可讓執行階段存取元件的中繼資料,而不需要載入類別。 API 特別是為最佳化效能並使負荷降至最低所設計。 中繼資料引擎可讓資料成為可使用,但除非提供記憶體中資料結構的直接存取,否則會停止。 相反地,在執行階段載入類別時,載入器會將中繼資料匯入至其專屬的資料結構,您可以透過執行階段的反映服務來瀏覽這些資料結構。
反映服務所能執行的動作遠多過中繼資料 API。 例如,反映服務會自動查核繼承階層架構 (Inheritance Hierarchy),以取得與繼承之方法和欄位的相關資訊。 中繼資料 API 只會傳回指定之類別的直接成員宣告,而且需要 API 用戶端執行其他呼叫,以查核階層架構和列舉繼承的方法。 反映服務方法會公開高階中繼資料檢視,而中繼資料 API 方法則會讓 API 用戶端完全控制資料結構查核行程。
回到頁首
範圍
在任何指定的時間,您都可能有多個包含中繼資料的不同記憶體區域。 例如,一個區域會對應磁碟上現有模組的所有中繼資料。 同時,您可能會將中繼資料發出至不同的區域,稍後當做模組儲存至檔案中。
![]() |
---|
「模組」一詞表示包含中繼資料的檔案。一般來說,這會是 .obj、exe 或 .dll 檔案,其中同時包含中繼資料和 Microsoft Intermediate Language (MSIL) 程式碼,但也可以是僅包含中繼資料的檔案。 |
記憶體中每個不同的中繼資料區域稱為「範圍」。 每個區域各對應至一個模組。 模組通常會當做磁碟上的檔案儲存,但這不是必要的。 例如,指令碼工具經常會產生從不保存至檔案的中繼資料。
範圍一詞之所以使用,是因為它表示在其中定義中繼資料語彙基元的區域。 例如,值為 N 的中繼資料語彙基元會在指定範圍中識別類別定義的詳細資料。 但對於不同範圍,具有該相同值 N 的中繼資料語彙基元可能對應至一組完全不同的詳細資料。
若要在記憶體中建立中繼資料範圍,您可以呼叫 IMetaDataDispenser 介面的 CComPtrBase::CoCreateInstance 方法。 這個方法會建立新的範圍,或是從檔案或記憶體位置,開啟現有的一組中繼資料結構。 每次呼叫 IMetaDataDispenser::DefineScope 或 IMetaDataDispenser::OpenScope 方法時,呼叫端會指定要接收的 API:
IMetaDataEmit 介面可讓工具寫入中繼資料範圍。
IMetaDataImport 介面可讓工具從中繼資料範圍進行讀取。
回到頁首
錯誤檢查
中繼資料 API 會執行少許語意錯誤檢查。 中繼資料 API 方法會假設:發出中繼資料的工具和服務會強制一般型別系統中所概述的物件系統規則,而且在開發時間中繼資料引擎的任何其他檢查都是非必要的。
回到頁首
相關主題
標題 |
說明 |
---|---|
提供用來識別抽象之中繼資料語彙基元的相關資訊,並說明這些語彙基元如何與中繼資料 API 搭配使用。 |
|
描述中繼資料 API 使用的編碼慣例。 |
|
描述 Unmanaged 介面,這類介面可提供 .Net Framework 型別、方法和欄位等項目所公開的中繼資料的存取權。 |
|
描述中繼資料 API 使用的 Unmanaged 全域靜態函式。 |
|
描述中繼資料 API 使用的 Unmanaged 列舉型別。 |
|
描述中繼資料 API 使用的 Unmanaged 結構。 |
|
描述中繼資料 API 使用的 Unmanaged 等位。 |
回到頁首