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

CLR 筆記:CLR 執行模型核心架構

     編輯:關於.NET

核心術語

  • CLR:Common Language Runtime,多語言共用執行庫。
  • 託管模組:標準 MS Windows PE32/PE32+ 檔案。
  • IL:Intermediate Language,中間語言(託管代碼)。
  • 中繼資料:特殊資料表集合。
  • 組件:抽象邏輯單位。
  • JIT:Just-In-Time 即時編譯,IL → 本機 CPU 指令。
  • FCL:Framework Class Library。
  • CTS:Common Type System,通用類型系統。
  • CLI:Common Language Infrastructure,ECMA 標準(CTS + 其他)。
  • CLS:Common Language Specification,公共語言規範(最小特性集)。

1.1 原始碼編譯為託管模組

流程:C# 原始碼 → C# 編譯器 → 託管模組 (IL + 中繼資料)。

託管模組組成:

  1. PE32/PE32+ 標頭:檔案類型 (GUI/CUI/DLL)、建立時間、32/64 位元。
  2. CLR 標頭:CLR 版本、進入點方法、模組中繼資料、資源、強名稱。
  3. 中繼資料:定義內容、引用內容、資訊清單。
  4. IL 代碼。

中繼資料用途:消除標頭/庫檔依賴、智慧感知、代碼驗證、序列化/反序列化、GC 追蹤物件生命週期與型別。

1.2 合併託管模組為組件

組件:一或多個託管模組/資源檔的邏輯分組,為最小重用、安全性、版本控制單元。可單檔/多檔。CLR 與組件協作,非託管模組。

1.3 載入 CLR

  • CLRVer 指令查看機器所有 CLR 版本。
  • csc /platform 決定組件類型:AnyCPU, x86, x64, Itanium。

1.4 執行組件代碼

  • ILAsm (IL→組件)、ILDasm (組件→IL)。
  • 高階語言為 CLR 子集,IL 可存取 CLR 所有功能。
  • JIT 編譯器運作:方法首次執行時,CLR 檢測引用型別,配置內部資料結構管理存取。每方法一條記錄與位址,初始化為 JITCompiler 函數。呼叫時:尋找 IL、編譯為本機指令、存入動態記憶體區塊、更新位址、跳轉執行。二次執行直接執行快取代碼。程式結束本機代碼捨棄。

編譯器開關影響:

開關IL 品質JIT 本機代碼品質
/optimize- /debug-未優化優化
/optimize- /debug(+)未優化未優化
/optimize+ /debug(-)優化優化

未優化 IL 產生 NOP 供偵錯設中斷點。IL 為堆疊架構(壓棧/彈棧)。IL 安全驗證機制保證記憶體存取安全,每個託管 EXE 獨立 AppDomain 執行。不安全代碼:/unsafe + unsafe 關鍵字。PEVerify 檢查不安全方法。

1.5 NGEN.exe 預先編譯

將 IL 預編譯至硬碟檔案:加快啟動、減少工作集 (代碼共享)。缺點:無法保護 IL 外洩、檔案可能失去同步、基址靜態計算修改慢、執行效能不如 JIT。無法使用 NGEN 檔案時自動回退 JIT。

1.7 CTS 規範

  • 類型可含 0+ 成員。
  • 類型可見性與成員存取規則。
  • 繼承、虛方法、物件生命週期管理規則。
  • 所有類型最終繼承自 System.Object。

1.8 CLS 合規性

  • C# 定義的型別/方法若可在 VB 使用,則不可定義 CLS 外的 public/protected 特性;private 不受限。
  • C# 允許僅大小寫不同的兩方法(不符 CLS)→ 不可為 public。
  • [assembly:CLSCompliant(true)] 標記組件,編譯器檢查 CLS 相容性。實測:定義 A() 與 a() 產生警告;移除屬性或改為 private 則無警告。IL 中兩方法共存,證明 IL 語法範圍大於 CLS。VB 專案引用該 DLL,IntelliSense 不顯示不符 CLS 成員;修正後可見。
  • 結論:不符 CLS 的語法在其他語言中不可見。

1.9 COM 互操作

  1. 託管代碼呼叫非託管 DLL 函數 (Kernel32.dll, User32.dll)。
  2. 託管代碼使用現成 COM 元件。
  3. 非託管代碼使用託管型別 (C# 寫 ActiveX/Shell 擴展)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved