元資料 是描述「資料的資料」,在 CLR 中以三張核心表組織:定義表、參考表、清單表。本節以經典 HelloWorld 為例,透過 ILDasm 解析元資料結構與 IL 指令流程。
| 表類型 | 內容 | 範例 |
|---|---|---|
| 定義表 | 模組、型別、方法、欄位、事件、屬性等定義 | TypeDef、MethodDef、FieldDef |
| 參考表 | 外部組件、模組、型別、方法引用 | AssemblyRef、TypeRef、MemberRef |
| 清單表 | 組件組成資訊、公開/內部可見性、版本、雜湊演算法 | Manifest、FileDef、ExportedType |
// Metadata version: v4.0.21006
.assembly extern mscorlib {
.publickeytoken = (B7 7A 5C 56 19 34 E0 89)
.ver 4:0:0:0
}
.assembly HelloWorld { ... }
.module HelloWorld.exe
// MVID: {B8EB35DD-5AD2-402C-B422-AA63B0AACCFA}
.imagebase 0x00400000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000003 // ILONLY | 32BITREQUIRED

圖 1 ILDasm 雙擊 MANIFEST 查看清單資訊
.method static void Main() cil managed {
.entrypoint
.maxstack 8
IL_0000: nop
IL_0001: ldstr "Hello World!"
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: call int32 [mscorlib]System.Console::Read()
IL_0011: pop
IL_0012: ret
}

圖 2 Main 方法 IL 指令流程
| 指令 | 動作 | 說明 |
|---|---|---|
| nop | 空操作 | 除錯斷點佔位 |
| ldstr | 推字串常值至堆疊 | 後接字串字面值 |
| call | 呼叫靜態/實例方法 | 需指定完整簽名 |
| pop | 彈出堆疊頂端值 | 丟棄回傳值 |
| ret | 方法返回 | 結束執行 |
提示:ILDasm 快捷鍵 Ctrl+M 可展開完整元資料視圖(含所有表資料列)。
本文摘抄自《.NET 安全揭秘》1.3 節
作者:玄魂
出處:https://www.cnblogs.com/xuanhun/