如何用JAVA一样流畅调试C#源代码
转载请注明出处:https://www.cnblogs.com/gtxck/articles/16423094.html
起因
最近在研究ServiceScope
的内一些内在运行逻辑,发现相关资料非常少,只有讲IOC
相关的文章有说怎么使用Core时代
的官方依赖注入
怎么使用。。遂决定还是要去看源代码.这部分源代码在Microsoft.Extensions.DependencyInjection
库中,源代码位置在src/libraries下。阅读了一点发现内部解析服务的时候会来回倒腾,那看代码的方式去梳理就非常难受了。。
有没有一种可能,C#也能像JAVA那样非常顺畅的调试源代码呢?
效果
还真有! 话不说多,看图:
速度非常快,像调试本地代码一样.. 比反编译出来的流畅度不知道高到那里去了!
不知道官方的项目用了什么黑魔法
,这里能直接拉到源代码(图里的外部源),而自己开发的项目做不到这一点。
具体步骤
这块其实官方有说明,但漏了几个关键点导致我卡了非常久,下面会进行详细说明:
PS1: 以windows vs为主,其它平台应该类似
PS2: 我主要是查看DI的构建逻辑,这块在不同版本差异不大所以我直接获取了6.0,其它的版本应该类似
1.打开官方仓库
官方仓库
然后你拉取你想看的分支代码到本地,我主要是看
2.找到他们的构建说明
3.安装对应平台的基础环境
win vs平台是这样安装的:
然后点击查看详细信息,弹出的提示(无法安装XXXXX
)可以忽略,然后点修改即可。
这一步,官方的说法是你只需要安装更高版本的SDK即可,不用一一匹配。通常情况下开发的电脑上都会安装Framework和.net的几个SDK,一般都有。我自己是安装 F4.0目标包+4.7.2目标包+net6.0的SDK。
[重点]4.还原对应库
资源浏览器定位到runtime的根目录
,记住这个build.cmd
右键打开命令行或pwd,像这样执行:
脚本会下载一个ps1
文件然后自动执行,我们等待即可,他会自动还原我们需要的库,并且把依赖的基础包也一并还原好。
官方的代码结构中已经做好了nuget配置和输出目录,我们已经不需要额外配置了,下一步进行编译。
5.生成对应库的dll文件
打开对应库的代码文件:
右键打开命令行或pwd,像这样执行:
等待编译结束去这个目录下找东西
每个库都会生成到artifacts
下面,然后不同架构对应一个文件夹,此时你就可以在你的测试项目中直接引用这个dll
了,愉快的调试吧。
[可选]6.生成依赖库文件
我这里是想调试Microsoft.Extensions.DependencyInjection
,在Nuget上就能看到他还依赖一个抽象定义包Microsoft.Extensions.DependencyInjection.Abstractions
,为了不在调试中卡壳,我把这个包一并如法炮制。
7. 导入项目并调试
然后在VS中用引用dll的方式导入这个包,最好是依赖包也一起导入进去
然后起启动项目,就会发现符号文件顺利加载:
其它
- 在查阅资料时发现其实也可以用VS直接编译,但需要配置些东西,我没看明白就用这个办法了,我也不需要编译所有的。
- vs code也可以,但我主要用VS就略过这部分了
build.cmd
脚本不加参数似乎是编译所有包,我不需要就跳过这个了