前言:.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 觸發條件
- 第 0 代配置超過臨界值(預算)。
- 呼叫
GC.Collect()。
- 系統記憶體不足(OS 通知)。
- AppDomain 卸載/程序結束。
2.3 GC 演算法:標記-壓縮
- 標記:從 GC Roots(堆疊區域變數、靜態欄位、CPU 寄存器、終結化佇列等)追蹤可達物件。
- 規劃:計算倖存物件新位址。
- 壓縮:移動倖存物件消除碎片,更新所有參考。
- 清除:釋放不可達物件記憶體。
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 Forms | System.Windows.Forms | 傳統桌面 RAD、事件驅動、GDI+ 繪圖 |
| WPF | System.Windows (PresentationFramework 等) | XAML、DirectX 渲染、資料繫結、樣式/範本、MVVM |
| ASP.NET Core | Microsoft.AspNetCore.* | 跨平台、高效能、中介軟體管線、DI、Razor、Blazor、gRPC、Minimal API |
| XML Web Services (ASMX) | System.Web.Services | 舊版 SOAP/WS-*,已由 WCF/gRPC/ASP.NET Core Web API 取代 |
| WCF | System.ServiceModel | 服務導向、多協定(HTTP/TCP/NamedPipe/MSMQ)、訊息安全、可靠會話 |
| MAUI | Microsoft.Maui | 跨平台原生 UI(iOS/Android/macOS/Windows),單一專案 |
四、執行流程:從原始碼到行程
csc / roslyn 編譯 .cs → .dll/.exe(PE 檔:IL + 中繼資料 + CLR Header + 選擇性原生映像)。
- OS Loader 載入 PE,讀取 CLR Header,啟動
mscoree.dll (CLR shim)。
- CLR 初始化:建立 AppDomain、載入核心組件(mscorlib/System.Private.CoreLib)、JIT 編譯
Main 方法。
- JIT 逐方法編譯 IL → 原生碼,快取於 JIT Code Heap。
- 執行期:GC、執行緒池、例外、安全性、互操作服務持續運作。
- 程序結束:CLR 關閉、Finalize 執行、記憶體歸還 OS。
五、.NET Framework vs .NET Core / .NET 5+ 關鍵差異
| 面向 | .NET Framework (4.8) | .NET 6/7/8 (LTS) |
| 跨平台 | 僅 Windows | Windows/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# 開發者從「會用語法」進化為「精通平台」的關鍵里程碑。