ASP.NET Core - 001 源码编译与调试


一、源码编译

需要编译的源码的代码仓库有两个,一个是 aspnetcore,另外一个是 extensions

如果有代理,编译的过程比较简单,参考微软的文档进行编译即可。

如果没有代理,那么整个编译流程可能非常慢,甚至无法正常进行,可以B站这个视频执行编译:编译并调试 Asp.Net Core 源码 —— B站视频

如果使用代理软件,建议使用 Global(全局)代理,同时命令行与 Powershell 需要设置代理:

# CMD set http_proxy=http://127.0.0.1:7890 & set https_proxy=http://127.0.0.1:7890 # Powershell $Env:http_proxy="http://127.0.0.1:7890";$Env:https_proxy="http://127.0.0.1:7890" 

编译时可能出现的错误:C4819 或其他的错误。实际代码是没有问题的,是编码的锅,解决方案:系统编码设置使用 UTF-8

系统设置 → 时间和语言 → 语言 → 相关设置 → 管理语言设置 → 管理 → 更改系统区域设置 → 勾选:使用 Unicode UTF-8 提供全球语言支持

设置以后重启系统即可,网上反馈设置后部分软件可能出现乱码,目前我没发现类似问题。但是,我第一次设置后,系统所有图标丢失,部分软件无法正常使用,但是取消选项又重新勾选了一次就正常了,如果像我一样出现问题,可以多设置几次试试。

补:发现了一个小问题,登录穿越火线,频道名、房间名、游戏玩家昵称的中文不显示了。/(ㄒoㄒ)/~~

二、调试

后续需要学习 ASP.NET Core,并深入了解其实现原理,所以肯定希望能够直接调试源码。

这里提供两个调试方案,第一个方案是借助调试工具 dnSpy 来进行调试,第二则是直接使用 Visual Studio 进行调试。

1. dnSpy 反编译调试

首先需要下载 dnSpy:dnSpy/dnSpy: .NET debugger and assembly editor (github.com),解压后可以直接打开。

然后我们可以随意创建一个 ASP.NET Core 的示例项目,打开 Visual Studio Code,创建一个 MVC 项目并编译。

dotnet new mvc -n 002_Debug
dotnet build

找到生成的 002_Debug.dll 拖到 dnSpy 中,找到程序入口设置断点并运行,即可进入调试:

debug-with-dnspy

 

2. 源服务器支持

首先如果是使用 Visual Studio Code,设置 launch.json 文件,增加如下内容:

//关闭 “仅我的代码” 项 "justMyCode": false, "symbolOptions": { //查找并下载symbol文件 "searchMicrosoftSymbolServer": true } 

debug-with-vsc

 

如果时使用 Visual Studio:

选项 → 调试 → 常规 → 取消 “仅我的代码” 的勾选 → 勾选 “启用源链接支持”
选项 → 调试 → 符号 → 符号文件(.pdb)的位置 → 勾选 “Microsoft 符号服务器”

配置完成后,调试时将会下载符号文件,可以正常调试 ASP.NET Core 的源代码。

debug-with-vs

 

3. 使用源码调试

首先是 ASP.NET Core,前文我们已经进行了编译,我们可以在 \artifacts\installers\Debug 找到 aspnetcore-runtime-3.1.9-dev-win-x64.msi 进行安装。

然后是 .NET Extensions,我们可以在项目中创建一个 NuGet.config,然后配置本地程序包源:

<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <clear/> <addkey="local1"value="C:\Users\hd2y\code\extensions\artifacts\packages\Debug\Shipping"/> <addkey="local2"value="C:\Users\hd2y\code\aspnetcore\artifacts\packages\Debug\Shipping"/> <addkey="nuget.org"value="https://api.nuget.org/v3/index.json"protocolVersion="3"/> </packageSources> </configuration> 

这时,运行程序进入调试,就可以通过单步调试进入 ASP.NET Core 的源码。

如果以上操作无法正常调试,可以 F12 查看对应的方法的程序集版本。

例如我的程序集版本是 3.1.10,而我编译的 ASP.NET Core 的版本是 3.1.9,调试就无法正常进入。

这里有两种解决方案,第一种是查看 3.1.9 的版本对应的 .NET SDK 的版本进行安装,然后指定引用程序集的版本:

<ProjectSdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> <RootNamespace>_002_Debug</RootNamespace> </PropertyGroup> <ItemGroup> <PackageReferenceInclude="Microsoft.Extensions.Hosting"Version="3.1.9"/> </ItemGroup> </Project> 

不指定版本的话,在我测试的时候不知道为什么转到定义程序集版本是 3.1.8,而不是文档中提到的 3.1.9
直接指定会使用 NuGet.config 配置的本地程序包源,如果设置后发现仍旧不行,可能 NuGet 有缓存,需要在 选项 → NuGet 包管理器 → 常规 → 清除所有 NuGet 缓存。

第二种方案是根据当前 .NET SDK 对应的 ASP.NET Core 版本,重新进行编译,具体版本对应关系可以查看 .NET Core SDK 的下载页:Download .NET Core 3.1 (Linux, macOS, and Windows) (microsoft.com)

 

转自 https://www.hd2y.net/archives/asp-dotnet-core-001-source-code-compilation-and-debugging


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM