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

.NET 平台核心架構深度解析:CLR、記憶體管理、框架類別庫與應用模型

     編輯:關於C#

前言:.NET 是 C# 的執行引擎與服務基礎設施

C# 編譯為中間語言(IL),在通用語言執行平台(CLR)上執行,享有記憶體管理、型別安全、安全性、互操作等平台服務。本文系統剖析 CLR 核心功能、垃圾收集器(GC)運作機制、.NET Framework 類別庫(FCL)組織架構、主要應用程式模型(Windows Forms、ASP.NET、XML Web Services)。

一、通用語言執行平台(CLR)

1.1 核心服務

  • 記憶體管理:自動配置/回收(GC),消除記憶體洩漏與野指標。
  • 執行緒管理:執行緒池、非同步模式、同步原語(Monitor、Mutex、Semaphore)。
  • 型別安全:CTS(通用型別系統)嚴格驗證 IL,防止緩衝區溢位、型別混淆。
  • 安全性:程式碼存取安全性(CAS,.NET Framework)、角色型安全性、透明度模型(.NET Core+)。
  • 即時編譯(JIT):IL → 原生機器碼,支援分層編譯、ReadyToRun (AOT)、動態 PGO。
  • 遠端處理/互操作:P/Invoke、COM Interop、System.Text.Json 序列化、gRPC/HTTP Client。
  • 例外處理:結構化例外(SEH)整合、跨語言例外傳播。

1.2 托管 vs 非托管程式碼

  • 托管程式碼:編譯為 IL,執行於 CLR,享有上述服務。
  • 非托管程式碼:直接編譯為機器碼(C/C++、Win32 API),需自行管理記憶體、例外、安全性。
  • CLR 透過 unsafe 區塊、Marshal、Span<T> 等提供受控的非托管互操作能力。

1.3 組件:部署、版本控制、安全性的基本單位

  • .dll / .exe 包含:IL 程式碼、中繼資料、資源、組件資訊清單(名稱、版本、文化特性、公開金鑰)。
  • 私有組件(應用程式目錄)vs 共用組件(GAC,.NET Framework)。
  • 並行執行:同一組件多版本共存(透過版本號區分)。

二、記憶體管理與垃圾收集器(GC)

2.1 托管堆與分代假設

  • 第 0 代:新配置物件(暫時性),回收頻率最高、成本最低。
  • 第 1 代:倖存第 0 代物件,緩衝區。
  • 第 2 代:長期存活物件(靜態欄位、大型物件、快取),回收成本最高。
  • 大型物件堆(LOH):≥ 85,000 bytes 物件,不壓縮(.NET 4.5.1+ 可選壓縮),直接第 2 代。

2.2 GC 觸發條件

  1. 第 0 代配置超過臨界值(預算)。
  2. 呼叫 GC.Collect()。
  3. 系統記憶體不足(OS 通知)。
  4. AppDomain 卸載/程序結束。

2.3 GC 演算法:標記-壓縮

  1. 標記:從 GC Roots(堆疊區域變數、靜態欄位、CPU 寄存器、終結化佇列等)追蹤可達物件。
  2. 規劃:計算倖存物件新位址。
  3. 壓縮:移動倖存物件消除碎片,更新所有參考。
  4. 清除:釋放不可達物件記憶體。

2.4 終結化與 IDisposable(詳見建構/解構函式篇)

  • 終結化佇列 → f-reachable 佇列 → 專用終結化執行緒 → 下次 GC 回收。
  • 雙重收集代價、順序不定、執行緒不安全 → 能用 IDisposable/SafeHandle 就不用終結化。

2.5 進階控制 API

API用途
GC.Collect(gen)強制指定代數回收(慎用)
GC.WaitForPendingFinalizers()阻塞直到終結化完成
GC.SuppressFinalize(obj)移出終結化佇列(Dispose 已清理)
GC.ReRegisterForFinalize(obj)重新登記終結化(罕見)
GC.GetTotalMemory(forceFullCollection)取得托管堆配置位元組數
GC.TryStartNoGCRegion / EndNoGCRegion延遲 GC 區域(低延遲場景)

三、.NET Framework 類別庫(FCL)架構

3.1 核心命名空間分層

  • System:基礎型別(Object、String、Array、Exception、Delegate、Attribute、GC、Math、DateTime)。
  • System.Collections / Generic / Concurrent:集合(List、Dictionary、Queue、Stack、Immutable、Concurrent)。
  • System.IO:檔案、資料流、管道、壓縮、記憶體對應檔案。
  • System.Text / Text.Json / Text.RegularExpressions:字串處理、JSON 序列化、正則表達式。
  • System.Threading / Tasks:執行緒、工作、非同步、同步原語、資料流區塊。
  • System.Reflection / Runtime.CompilerServices:反射、發射、特性、Caller Info。
  • System.Security / Cryptography:加密、雜湊、簽章、隨機數、權限。
  • System.Diagnostics:追蹤、效能計數器、程序控制、合約。
  • System.Net / Http / Sockets:網路程式設計、HTTP Client、WebSocket、gRPC。
  • System.Data / Data.Common / Data.SqlClient:ADO.NET 資料存取。
  • System.Xml / Linq:XML 文件模型、LINQ to XML。

3.2 應用程式模型組件

模型命名空間/組件特色
Windows FormsSystem.Windows.Forms傳統桌面 RAD、事件驅動、GDI+ 繪圖
WPFSystem.Windows (PresentationFramework 等)XAML、DirectX 渲染、資料繫結、樣式/範本、MVVM
ASP.NET CoreMicrosoft.AspNetCore.*跨平台、高效能、中介軟體管線、DI、Razor、Blazor、gRPC、Minimal API
XML Web Services (ASMX)System.Web.Services舊版 SOAP/WS-*,已由 WCF/gRPC/ASP.NET Core Web API 取代
WCFSystem.ServiceModel服務導向、多協定(HTTP/TCP/NamedPipe/MSMQ)、訊息安全、可靠會話
MAUIMicrosoft.Maui跨平台原生 UI(iOS/Android/macOS/Windows),單一專案

四、執行流程:從原始碼到行程

  1. csc / roslyn 編譯 .cs → .dll/.exe(PE 檔:IL + 中繼資料 + CLR Header + 選擇性原生映像)。
  2. OS Loader 載入 PE,讀取 CLR Header,啟動 mscoree.dll (CLR shim)。
  3. CLR 初始化:建立 AppDomain、載入核心組件(mscorlib/System.Private.CoreLib)、JIT 編譯 Main 方法。
  4. JIT 逐方法編譯 IL → 原生碼,快取於 JIT Code Heap。
  5. 執行期:GC、執行緒池、例外、安全性、互操作服務持續運作。
  6. 程序結束:CLR 關閉、Finalize 執行、記憶體歸還 OS。

五、.NET Framework vs .NET Core / .NET 5+ 關鍵差異

面向.NET Framework (4.8).NET 6/7/8 (LTS)
跨平台僅 WindowsWindows/Linux/macOS/ARM64
部署機器級安裝、GAC獨立部署/框架相依、單一檔案、AOT
效能基準JIT 優化、Tiered Compilation、PGO、Span/Vector、Native AOT 大幅提升
API 面完整 Windows 整合跨平台子集 + 平台擴充包 (Windows Forms/WPF/WinRT)
支援週期安全性更新至 2026+LTS 每 2 年(長期支援 3 年)

結語

.NET 平台提供了世界級的執行引擎(CLR)、自動記憶體管理(分代 GC)、龐大統一的類別庫(FCL)與多元應用模型。深入理解 CLR 服務邊界、GC 分代機制、組件版本控制、托管/非托管互操作界線,並緊跟 .NET 現代化演進(跨平台、高效能、AOT、Cloud Native),是 C# 開發者從「會用語法」進化為「精通平台」的關鍵里程碑。

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