像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. 关键构建流程
Keep Exploring

延伸阅读

更多文章
同分类 / 同标签 2024/3/14

c#與java

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

继续阅读
同分类 / 同标签 2022/5/5

net性能優化-使用結構體替代類

我們知道在c#和java明顯的一個區別就是c#可以自定義值類型,也就是今天的主角struct,我們有了更加方便的class為什麼微軟還加入了struct呢?

继续阅读