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

《C# to IL》第一章 IL 入門(七):組件屬性指令與 ildasm 反組譯實戰

     編輯:關於C語言

組件層級偽指令詳細解析

.subsystem:目標子系統

值子系統
2Windows Character (Console)
3Windows GUI
5OS/2 等舊系統

對應 C# 編譯器 /target:exe (Console, 值 3) vs /target:winexe (GUI, 值 2)。

.corflags:64 位元標誌

  • 1:IL 編譯產生的可執行檔
  • 64:Library (DLL)
  • 對應 CorFlags.exe 工具顯示的標誌位

.assembly:組件定義

  • 每個模組僅能有一個 .assembly 指令
  • EXE 必須有,DLL 可選(但建議有)
  • 包含子指令:.hash、.ver、.publickey 等

.hash:雜湊演算法


.assembly MyLib {
    .hash algorithm 0x00008004 // SHA1
    .ver 1:2:3:4
}

.ver:版本號

四段式:Major:Minor:Build:Revision,對應 AssemblyVersionAttribute。

.assembly extern:外部組件參考


.assembly extern mscorlib {
    .publickeytoken = (B7 7A 5C 56 19 34 E0 89) // 公開金鑰 Token
    .ver 4:0:0:0
}
  • 參考外部組件時必須宣告
  • mscorlib 為核心庫,幾乎所有組件都參考

.originator:建立者識別

包含公開金鑰的 8 位元組雜湊值,用於強名稱驗證。

完整範例:從 C# 到 IL 反組譯流程

1. C# 原始碼


// a.cs
class Program {
    public static void Main() {
        System.Console.WriteLine("hi");
    }
}

2. 編譯


csc a.cs
// 產生 a.exe

3. ILDASM 反組譯


ildasm /out=a.il a.exe
// 產生 a.il (IL 組合語言) 與 a.res (資源)

4. 關鍵 IL 片段解析


.module a.exe
.subsystem 3          // GUI 子系統 (預設)
.corflags 1           // IL 可執行檔

.assembly extern mscorlib {
    .publickeytoken = (B7 7A 5C 56 19 34 E0 89)
    .ver 4:0:0:0
}

.assembly a {
    .hash algorithm 0x00008004
    .ver 0:0:0:0
}

.class private auto ansi Program extends [mscorlib]System.Object {
    .method public hidebysig static void Main() cil managed {
        .entrypoint
        .maxstack 8
        ldstr "hi"
        call void [mscorlib]System.Console::WriteLine(string)
        ret
    }
}

IL 組譯驗證


ilasm /dll /key=mykey.snk a.il
// 產生 a.dll (若原為 exe 霻調整 .subsystem/.corflags)

工具鏈總覽

工具用途
cscC# 編譯器
ildasmIL 反組譯器 (Managed → IL)
ilasmIL 組譯器 (IL → Managed)
CorFlags檢視/修改組件標誌
sn強名稱金鑰管理
peverify驗證 IL 類型安全

學習建議

  1. 寫簡單 C# → ildasm → 閱讀 IL → ilasm 重組 → peverify 驗證
  2. 專注理解:.maxstack、.locals、ldarg/ldloc/stloc、call/callvirt、newobj、box/unbox
  3. 對照 ECMA-335 標準文件
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved