iT邦幫忙

2025 iThome 鐵人賽

DAY 8
0

5. dotnet run 深入

傳統:

  1. 確認專案檔 -> restore(還原 NuGet)
  2. Build -> 選擇目標框架 / RID -> 產出 dll / apphost
  3. 啟動:dotnet <App>.dll 或直接執行 apphost

單檔模式 (dotnet run hello.cs):

  1. 偵測不是專案檔 -> 進入 File-Based Flow
  2. 建構 FileBasedAppContext(Hash + Cache 目錄)
  3. 解析 directives(#:package#:property ...)生成 In-memory 專案
  4. 決策:是否跳過 MSBuild(快取指紋比對)
  5. 直接 csc 編譯 或 走 msbuild /t:Build 最小化流程
  6. 產出於使用者快取(避免污染當前資料夾)
  7. 執行(可能為普通 IL / 或 Native AOT 如果屬性啟用)

你前面章節看到的「單 cs run 模式」就是這條快速路徑,其核心實作散布於:
src/Cli/dotnet/commands/dotnet-run/ 與專門的 FileBased utility 類別從 RunCommand.cs 追進去。

6. MSBuild 與 Sdk Import 鏈

專案檔 <Project Sdk="Microsoft.NET.Sdk"> 展開後(簡化):

Microsoft.NET.Sdk
  ├─ Sdk.props (設定預設屬性、TFM、LangVersion 推導)
  ├─ <你的專案>.csproj
  └─ Sdk.targets (定義 Compile / Publish / Pack 等目標)

關鍵觀念:

  1. CLI 呼叫 MSBuild 時注入 Global Properties(如 Configuration=DebugTargetFramework=net10.0
  2. SdkResolver 決定實際 Sdk 路徑(支援多 SDK 並存)
  3. Task 例:ResolvePackageAssets 讀取 project.assets.json 建立參考項
  4. Trim / AOT / PGO 設定:透過 Properties (PublishTrimmed, PublishAot, ReadyToRun) 傳遞到對應 Target,最後驅動工具鏈 (illink, crossgen2)

追 Code 路線:src/Tasks/Microsoft.NET.Build.Tasks/ -> 找 Task 對應的 .cs -> 搜尋其 MSBuild 名稱在 Sdk.targets 出現位置。


上一篇
Build 原始碼倉庫
系列文
新 .NET & Azure & IoT & AI 開源技術實戰手冊 (含深入官方程式碼講解) 8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言