起因
最近在研究ServiceScope
的內一些內在運行邏輯,發現相關資料非常少,只有講IOC
相關的文章有說Core時代
的官方依賴注入
怎么使用。。遂決定還是要去看源代碼。這部分源代碼在Microsoft.Extensions.DependencyInjection
庫中,源代碼位置在src/libraries[1]下。閱讀了一點,發現內部解析服務的時候會來回倒騰,那看代碼的方式去梳理就非常難受了。。
有沒有一種可能, C#也能像JAVA那樣非常順暢的調試源代碼呢?
效果
還真有!?話不說多,看圖:


速度非常快,像調試本地代碼一樣.. 比反編譯出來的流暢度不知道高到那里去了!
不知道官方的項目用了什么黑魔法
,這里能直接拉到源代碼(圖里的外部源),而自己開發的項目做不到這一點。
具體步驟
這塊其實官方有說明,但漏了幾個關鍵點導致我卡了非常久,下面會進行詳細說明:
PS1:以Windows VS為主,其它平臺應該類似
PS2: 我主要是查看DI的構建邏輯,這塊在不同版本差異不大, 所以我直接獲取了6.0
1.打開官方倉庫
官方倉庫[2]
然后你拉取你想看的分支代碼到本地,我主要是看

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
,為了不在調試中卡殼,我把這個包一并如法炮制。
其它
在查閱資料時發現其實也可以用VS直接編譯,但需要配置些東西,我沒看明白就用這個辦法了,我也不需要編譯所有的。
VS Code
也可以,但我主要用VS就略過這部分了build.cmd
腳本不加參數似乎是編譯所有包, 我不需要就跳過這個了
參考資料
官方構建文檔[3]
關鍵構建流程[4]
參考資料
[1]
src/libraries: https://github.com/dotnet/runtime/tree/release/6.0/src/libraries/Microsoft.Extensions.DependencyInjection
[2]官方倉庫: https://github.com/dotnet/runtime
[3]官方構建文檔: https://github.com/dotnet/runtime/blob/main/docs/workflow/requirements/windows-requirements.md
[4]關鍵構建流程: https://github.com/dotnet/runtime/blob/main/docs/workflow/README.md