昨天,我終於理解了一件以前從來沒有注意過的事情。
按下 Build,並不代表程式開始執行。
Build 的工作,是把我的 C# 原始碼編譯完成,並準備好執行程式所需要的一切。
但當我打開 bin/Debug/net10.0 資料夾時,我又有了新的疑問。
裡面除了我預期的 .exe 之外,竟然還多了很多以前從來沒有點開過的檔案:
MiniWebFramework.dll
MiniWebFramework.exe
MiniWebFramework.pdb
MiniWebFramework.deps.json
MiniWebFramework.runtimeconfig.json
以前的我總覺得反正能執行就好,這些檔案不用管
Build 完後,為什麼會產生這麼多檔案?
以前我一直以為uild 最重要的成果就是:
MiniWebFramework.exe
其他檔案大概只是:
-暫存資料
-除錯資訊
-系統自己產生的垃圾檔
甚至刪掉也沒關係。
直到今天我才開始懷疑:
如果它們真的沒用,為什麼每次 Build 都一定會重新產生?
Build 完後到底多了哪些檔案?
我先執行:
dotnet build
接著打開:
bin
└── Debug
└── net10.0
我看到了:
MiniWebFramework.dll
MiniWebFramework.exe
MiniWebFramework.pdb
MiniWebFramework.deps.json
MiniWebFramework.runtimeconfig.json

再來我先打開MiniWebFramework.runtimeconfig.json
我第一眼看到時完全看不懂。
但是仔細觀察後,我開始猜測:
-net10.0 應該代表目標 Framework。
-Microsoft.NETCore.App 看起來像是 .NET Runtime。
-這份檔案不像是程式碼,比較像是一份「執行環境設定」。
查閱官方文件後,我確認自己的猜測是正確的。
runtimeconfig.json 的用途,是告訴 .NET:
這個程式需要哪一個 Runtime 才能執行。
也就是說它不是寫給程式設計師看的。
而是寫給 .NET Runtime 看的。
接著我打開 MiniWebFramework.deps.json
裡面看到:
runtimeTarget
targets
libraries
MiniWebFramework.dll
剛開始完全不知道它們代表什麼。
後來才知道。
它記錄的是:
程式執行時需要依賴哪些組件(Dependencies)。
也就是說程式除了自己的程式碼之外。
還需要知道我要載入哪些 Assembly?
如果缺少其中一個程式可能就無法正常啟動。
因此deps.json 更像是一份:
程式的依賴清單。
最後我把注意力放在:
MiniWebFramework.dll
原本我以為它只是另一個執行檔。
但今天查閱資料後才知道它其實是Build 後最重要的成果之一。
因為真正編譯完成的程式。
主要就存在MiniWebFramework.dll
至於DLL 裡到底放了什麼?
今天我還沒有深入研究。
因為我希望把它留到下一篇,親自拆開看看。
查閱 Microsoft 官方文件後,我得到兩個重要結論:
runtimeconfig.json:描述應用程式需要的 Runtime 與執行環境設定。
deps.json:描述程式執行時需要載入的相依組件與套件。
而 .dll 則是 Build 產生的組件(Assembly),保存了編譯完成後的程式內容,供 .NET Runtime 載入與執行。
以前,我一直以為 Build 只是把程式編譯完成。
今天我才知道,真正完成的,不只是程式碼。
而是一整套讓程式能夠順利執行的成果,程式能夠啟動。
靠的不只是 Program.cs。
而是 Build 默默準備好的每一份檔案。
現在我的 Mini Web Framework 還只有一個簡單的 Program.cs。
但即使功能非常少,每一次 Build 都還是會產生完整的 DLL、Runtime 設定與相依資訊。
這讓我理解到,這些檔案並不是因為程式很複雜才出現,而是 每一個 .NET 應用程式都需要的基礎結構。
未來當我加入 Router、Middleware、HttpContext 等功能時,它們同樣會經過 Build,並成為這些輸出成果的一部分。
今天,我知道 Build 不只是把程式編譯完成。
它還準備了程式執行所需要的各種檔案。
但是其中最神秘的,還是MiniWebFramework.dll
如果真正的程式都在 DLL 裡。
那麼DLL 裡到底裝了什麼?
它是 C# 原始碼?還是 CPU 能直接執行的機器碼?
下一篇,我想親自把 DLL 拆開,一探究竟。