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

脫離 IDE 手寫 C# Hello World:深度解析 CLR 編譯與執行模型

     編輯:關於C語言

習慣了 Visual Studio 「F5 一鍵運行」的開發者,是否理解源碼如何變為可執行機器碼?本文帶你拋棄 IDE,用記事本 + csc.exe + ngen.exe 手動構建程序,直觀體驗 CLR 的**編譯期**與**運行期**全生命週期。

一、 手動編譯:從 .txt 到 .exe

  1. 新建 HelloWorld.txt,寫入標準 C# 代碼。
  2. 打開「Visual Studio Developer Command Prompt」。
  3. 執行:csc /out:Hello.exe HelloWorld.txt
  4. 生成 Hello.exe,直接運行即輸出「Hello World」。

VS 命令提示字元
切換目錄
編譯成功

二、 編譯期:源碼 → 托管模塊 → 程序集

編譯期流程

  • 步驟 1:C# 編譯器 (csc.exe) 將每個源文件編譯為托管模塊(含 IL 代碼、元數據、CLR Header)。
  • 步驟 2:將多個模塊與資源文件合併為程序集 (.exe/.dll),即部署單元。

文件屬性「生成操作」的本質:告訴編譯器如何處理文件——Compile (編入模塊)、Embedded Resource (嵌入程序集)、Content (複製輸出目錄) 等。
生成操作屬性
ILSpy 查看嵌入資源

三、 運行期:IL → JIT → 機器碼

程序集內的 IL 是 CPU 無關的中間語言。首次調用時,CLR 執行:

  1. 安全性驗證(權限、簽名)。
  2. 分配內存(堆、棧、靜態字段)。
  3. JIT (Just-In-Time) 編譯:將即將執行的方法 IL 編譯為本機機器碼,緩存備用。

首次運行慢、二次極快的原因:

Console.WriteLine("Hello"); // 首次調用:JIT 編譯 → 執行
Console.WriteLine("World!"); // 二次調用:直接跳轉緩存的機器碼,跳過 JIT

模擬大量類型加載延遲:
大量類型代碼

四、 NGen:預編譯為原生映像

ngen.exe 將 IL 預編譯為機器碼並存入 Native Image Cache,解決兩大痛點:

  • 啟動加速:省去 JIT 時間,ngen install Hello.exe 後瞬間啟動。
    ngen install
  • 代碼共享**:多進程加載同一程序集時,通過「內存映射」共享原生代碼頁,節省物理內存。

ASP.NET 專用預編譯工具:aspnet_compiler.exe。

五、 總結

理解 源碼 → IL → JIT → 機器碼 的轉換鏈路,是診斷啟動性能、內存佔用、異常調試的基石。脫離 IDE 動手操作一次,勝過讀十遍文檔。

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