C# 程式碼不直接編譯為機器碼,而是編譯為中間語言(IL),由 CLR(Common Language Runtime)在執行時期透過 JIT 編譯為原生碼。理解這套機制,是掌握 .NET 應用程式效能、除錯、部署的關鍵。
| 服務 | 描述 | 開發者受益 |
|---|---|---|
| 跨語言整合 | Common Language Specification (CLS) | VB 繼承 C# 類別、C# 實作 VB 介面 |
| 自動記憶體管理 | Garbage Collection (GC) | 消除記憶體洩漏、雙重釋放、懸空指標 |
| 跨語言例外處理 | 統一堆疊展開機制 | C# 拋出、VB 捕捉、C++ 包裝無縫串聯 |
| 增強安全性 | Code Access Security (CAS)、型別安全 | 防止緩衝區溢位、未授權存取 |
| 版本支援 | 並存執行、強式名稱、GAC | 解決「DLL 地獄」,多版本共存 |
| 元件互動簡化 | Metadata 內嵌、無註冊表依賴 | XCOPY 部署、免註冊 COM |
// 載入/儲存
ldarg.0 // 載入第 0 個引數 (this)
ldloc.1 // 載入區域變數 1
stloc.0 // 儲存至區域變數 0
// 算術/邏輯
add, sub, mul, div
and, or, xor, not
// 控制流
brtrue.s LABEL // 若真則跳轉
brfalse.s LABEL // 若偽則跳轉
call METHOD // 呼叫方法
ret // 返回
// 物件操作
newobj CTOR // 建立物件
callvirt METHOD // 虛擬方法呼叫
ldfld FIELD // 載入欄位
stfld FIELD // 儲存欄位
為何不一次編譯所有 IL?因為程式只執行部分路徑,JIT 避免編譯未使用程式碼,節省啟動時間與記憶體。
| 編譯器 | 特性 | 適用場景 |
|---|---|---|
| Standard JIT | 完整優化、資料流分析、高品質程式碼 | 預設、伺服器應用、長期執行服務 |
| EconoJIT | 快速編譯、較少優化、可捨棄已編譯程式碼釋放記憶體 | 記憶體受限裝置、桌面應用 |
| PreJIT (NGEN) | 安裝時預先編譯為原生映像、無 JIT 延遲 | 啟動速度關鍵應用、大型桌面程式 |
jitman.exe (SDK/bin 目錄) 提供圖形介面調整:
VOS 定義跨語言的型別系統、中繼資料格式、CLS 規範、虛擬執行系統 (VES) 四大支柱。
System.ObjectInteger 16-bit vs C++ int 32-bit)定義跨語言互通的型別子集與規則。關鍵規則:
| 類別 | 規則範例 |
|---|---|
| 型別 | 僅支援 CLS 型別 (bool, byte, int, long, float, double, string, object 等),ushort、uint 非 CLS 相容 |
| 成員 | 公用/受保護成員必須符合 CLS;大小寫不敏感區分識別碼 |
| 方法 | 可多載,參數/回傳型別需 CLS 相容 |
| 屬性 | get_Prop/set_Prop 命名慣例,不可與同名方法衝突 |
| 事件 | 加入/移除方法參數需為 System.Delegate 衍生型別 |
| 例外 | 自訂例外必須繼承 System.Exception |
設計公開類別庫時應遵循 CLS,確保 VB.NET、F#、IronPython 等語言皆可使用。
VOS 的執行實作,核心組件: