C# Source (.cs)
│
▼ Roslyn Compiler (csc.exe / CSC.dll)
Intermediate Language (IL) + Metadata → Assembly (.dll/.exe)
│
▼ Runtime (CLR / CoreCLR)
┌─────────────────────────────────────┐
│ JIT Compiler (Just-In-Time) │
│ 方法首次呼叫 → 編譯為原生機器碼 │
│ 快取於 JIT Code Heap │
└─────────────────────────────────────┘
│
▼ Execution (CPU)
| 模式 | 觸發時機 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| 標準 JIT | 方法首次呼叫 | 啟動快、只編譯用到的 | 首次呼叫延遲、重複編譯 | 一般應用 |
| Tiered Compilation | 分層:快速編譯 → 優化重編譯 | 平衡啟動/極致效能 | 複雜度高 | .NET Core 3.0+ 預設 |
| ReadyToRun (R2R) | 建置時預編譯 | 啟動極快、無 JIT 延遲 | 體積大、平台專屬、無 Tiered 優化 | 單檔發布、容器、AOT 需求 |
| NGen / Crossgen | 安裝/建置時 | 類似 R2R | 維護困難、版本綁定 | .NET Framework 時代 |
// C#: int Add(int a, int b) => a + b;
// IL:
.method public hidebysig static int32 Add(int32 a, int32 b) cil managed {
.maxstack 2
ldarg.0 // 載入參數 0 (a)
ldarg.1 // 載入參數 1 (b)
add // 整數相加
ret // 返回
}
ildasm.exe (SDK 內建) - GUI 瀏覽 ILdotnet-ildasm (Global Tool) - 跨平台dotnet dump analyze - 記憶體傾印分析sealed、non-virtual、介面約束 where T : struct[MethodImpl(MethodImplOptions.AggressiveInlining)] 強制內聯[MethodImpl(MethodImplOptions.NoInlining)] 防止內聯 (除錯/追蹤)dotnet publish -r win-x64 -p:PublishReadyToRun=true
