流程:C# 原始碼 → C# 編譯器 → 託管模組 (IL + 中繼資料)。
託管模組組成:
中繼資料用途:消除標頭/庫檔依賴、智慧感知、代碼驗證、序列化/反序列化、GC 追蹤物件生命週期與型別。
組件:一或多個託管模組/資源檔的邏輯分組,為最小重用、安全性、版本控制單元。可單檔/多檔。CLR 與組件協作,非託管模組。
CLRVer 指令查看機器所有 CLR 版本。csc /platform 決定組件類型:AnyCPU, x86, x64, Itanium。ILAsm (IL→組件)、ILDasm (組件→IL)。JITCompiler 函數。呼叫時:尋找 IL、編譯為本機指令、存入動態記憶體區塊、更新位址、跳轉執行。二次執行直接執行快取代碼。程式結束本機代碼捨棄。編譯器開關影響:
| 開關 | IL 品質 | JIT 本機代碼品質 |
|---|---|---|
| /optimize- /debug- | 未優化 | 優化 |
| /optimize- /debug(+) | 未優化 | 未優化 |
| /optimize+ /debug(-) | 優化 | 優化 |
未優化 IL 產生 NOP 供偵錯設中斷點。IL 為堆疊架構(壓棧/彈棧)。IL 安全驗證機制保證記憶體存取安全,每個託管 EXE 獨立 AppDomain 執行。不安全代碼:/unsafe + unsafe 關鍵字。PEVerify 檢查不安全方法。
將 IL 預編譯至硬碟檔案:加快啟動、減少工作集 (代碼共享)。缺點:無法保護 IL 外洩、檔案可能失去同步、基址靜態計算修改慢、執行效能不如 JIT。無法使用 NGEN 檔案時自動回退 JIT。
System.Object。public/protected 特性;private 不受限。public。[assembly:CLSCompliant(true)] 標記組件,編譯器檢查 CLS 相容性。實測:定義 A() 與 a() 產生警告;移除屬性或改為 private 則無警告。IL 中兩方法共存,證明 IL 語法範圍大於 CLS。VB 專案引用該 DLL,IntelliSense 不顯示不符 CLS 成員;修正後可見。Kernel32.dll, User32.dll)。