像JAVA一樣流暢偵錯C#原始碼?

像JAVA一樣流暢偵錯C#原始碼?

有沒有一種可能,C#也能像JAVA那樣非常順暢的偵錯原始碼呢?

最後更新 2022/6/29 下午9:03
长空X
預計閱讀 4 分鐘
分類
.NET
標籤
.NET C# Java

起因

最近在研究 ServiceScope 的一些內部運行邏輯,發現相關資料非常少,只有講 IOC 的文章有提到 Core 時代 的官方 依賴注入 怎麼使用。於是決定還是去看原始碼。這部分原始碼在 Microsoft.Extensions.DependencyInjection 庫中,原始碼位置在 src/libraries 下。閱讀了一點,發現內部解析服務的時候會來回倒騰,用看程式碼的方式去梳理非常難受。

有沒有可能,C# 也能像 JAVA 那樣非常順暢地除錯原始碼呢?

效果

還真的有!話不多說,看圖:

速度非常快,就像在除錯本地程式碼一樣。比反編譯出來的流暢度不知道高到哪裡去了!

不知道官方的專案用了什麼 黑魔法,這裡能直接拉到原始碼(圖裡的外部來源),而自己開發的專案做不到這一點。

具體步驟

這塊其實官方有說明,但漏了幾個關鍵點導致我卡了非常久,下面會進行詳細說明:

  • PS1: 以 Windows VS 為主,其他平台應該類似
  • PS2: 我主要是查看 DI 的建構邏輯,這塊在不同版本差異不大,所以我直接獲取了 6.0

1.打開官方倉庫

官方倉庫

然後你拉取你想看的分支程式碼到本地,我主要是看

2.找到他們的建構說明

3.安裝對應平台的基礎環境

Windows VS 平台是這樣安裝的:

然後點擊查看詳細資訊,彈出的提示(無法安裝XXXXX)可以忽略,然後點修改即可。

這一步,官方的說法是你只需要安裝更高版本的 SDK 即可,不用一一匹配。通常情況下開發的電腦上都會安裝 .NET Framework 和 .NET 的幾個 SDK,一般都有。我自己是安裝 .NET Framework 4.0 目標套件 + 4.7.2 目標套件 + NET 6.0 的 SDK。

[重點]4. 還原對應庫

資源瀏覽器定位到 runtime 的根目錄,記住這個 build.cmd

右鍵打開命令列或 pwd,像這樣執行:

腳本會下載一個 ps1 檔案然後自動執行,我們等待即可,他會自動還原我們需要的庫,並且把依賴的基礎套件也一併還原好。

官方的程式碼結構中已經做好了 nuget 設定和輸出目錄,我們已經不需要額外設定了,下一步進行編譯。

5.生成對應庫的 dll 檔案

打開對應庫的程式碼檔案:

右鍵打開命令列或 pwd,像這樣執行:

等待編譯結束去這個目錄下找東西

每個庫都會生成到 artifacts 下面,然後不同架構對應一個資料夾,此時你就可以在你的測試專案中 直接引用這個 dll 了,愉快地進行除錯吧。

[可選]6.生成依賴庫檔案

我這裡是想除錯 Microsoft.Extensions.DependencyInjection,在 NuGet 上就能看到他還依賴一個抽象定義套件 Microsoft.Extensions.DependencyInjection.Abstractions,為了不在除錯中卡殼,我把這個套件一併如法炮製。

其他

  1. 在查閱資料時發現其實也可以用 VS 直接編譯,但需要設定些東西,我沒看明白就用這個辦法了,我也不需要編譯所有的。
  2. VS Code 也可以,但我主要用 VS 就略過這部分了
  3. build.cmd 腳本不加參數似乎是編譯所有套件,我不需要就跳過這個了

參考資料

  1. 官方建構文件
  2. 關鍵建構流程
繼續探索

延伸閱讀

更多文章
同分類 / 同標籤 2024/3/14

C#與Java

在動態且不斷演進的軟體開發世界中,Java 和 C# 是兩個巨頭,每個都有自己獨特的優勢、理念和生態系統。本文深入比較了 Java 和 C#,探討了它們的歷史背景、語言特性、效能指標、跨平台功能等。

繼續閱讀