首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET 元資料與 IL 指令集入門:從 HelloWorld 看清單、定義表與常用操作碼

     編輯:關於.NET

元資料 是描述「資料的資料」,在 CLR 中以三張核心表組織:定義表、參考表、清單表。本節以經典 HelloWorld 為例,透過 ILDasm 解析元資料結構與 IL 指令流程。

三大元資料表職責

表類型內容範例
定義表模組、型別、方法、欄位、事件、屬性等定義TypeDef、MethodDef、FieldDef
參考表外部組件、模組、型別、方法引用AssemblyRef、TypeRef、MemberRef
清單表組件組成資訊、公開/內部可見性、版本、雜湊演算法Manifest、FileDef、ExportedType

HelloWorld 清單資訊實測

// 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

ILDasm 查看 Manifest

圖 1 ILDasm 雙擊 MANIFEST 查看清單資訊

Main 方法 IL 碼逐行解析

.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
}

Main 方法 IL 碼

圖 2 Main 方法 IL 指令流程

指令對照表

指令動作說明
nop空操作除錯斷點佔位
ldstr推字串常值至堆疊後接字串字面值
call呼叫靜態/實例方法需指定完整簽名
pop彈出堆疊頂端值丟棄回傳值
ret方法返回結束執行

IL 驗證與型別安全

  • 驗證過程檢查 MSIL 與元資料,確保型別安全:僅存取授權記憶體、呼叫合法方法
  • 驗證通過的代碼才能執行;部分型別安全代碼可能因驗證限制而無法通過
  • 安全性原則可要求可驗證代碼,否則執行時拋出例外

提示:ILDasm 快捷鍵 Ctrl+M 可展開完整元資料視圖(含所有表資料列)。


本文摘抄自《.NET 安全揭秘》1.3 節
作者:玄魂
出處:https://www.cnblogs.com/xuanhun/

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved