Roslyn 通过 EmbedAllSources 将源代码嵌入到 PDB 符号文件中方便开发者调试
本文来告诉大家如何在项目文件里面添加上 EmbedAllSources 属性,将自己的代码嵌入到 PDB 符号文件里面,让开发者们在调试的时候,可以看到库的源代码
是否记得 PDB 符号文件的作用?符号文件将会记录着 DLL 文件里面的二进制内容和源代码之间的对应,根据 PDB 符号文件将可以关联上 DLL 和源代码。假设此时既有 PDB 符号文件,又有源代码,那自然就可以在调试的时候进入源代码进行调试
为了减少误解,必须说明的是,有 PDB 符号文件,可以方便进行代码关联调试。对于 .NET 的应用,没有 PDB 符号文件,依然可以愉快调试,原因是 .NET 的 DLL 里面自带了足量的信息。但是有 PDB 符号文件的话,调试更好评
默认的发布的库,都是不会带上源代码的,此时空有 PDB 符号文件,还不能愉快调试源代码。好在咱可以使用 EmbedAllSources 属性,将源代码嵌入到 PDB 符号文件里面,此时在 VisualStudio 2019 调试,将可以通过 PDB 文件调试进入到对应的源代码
将源代码放入到 PDB 符号文件的方法很简单,只需要在 csproj 项目文件添加如下代码即可
<EmbedAllSources>true</EmbedAllSources>
默认的 NuGet 包是不带 PDB 符号文件的,官方推荐将 PDB 符号文件打到 snupkg 里面再推送。如果期望只作为一个 NuGet 包,可以加上如下代码也将符号文件放入 NuGet 里面。使用下面代码可以将 PDB 符号文件放入 NuGet 包,也将源代码打包压缩嵌入在 PDB 符号文件里面
<PropertyGroup>
<EmbedAllSources>true</EmbedAllSources>
<!-- Include symbol files (*.pdb) in the built .nupkg -->
<AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>
</PropertyGroup>
更改之后的 csproj 项目文件内容大概如下
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<TargetFrameworks>net45;netcoreapp3.1</TargetFrameworks>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<UseWpf>True</UseWpf>
<UseWindowsForms>True</UseWindowsForms>
</PropertyGroup>
<PropertyGroup>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<EmbedAllSources>true</EmbedAllSources>
<!-- Include symbol files (*.pdb) in the built .nupkg -->
<AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>
</PropertyGroup>
加上了 EmbedAllSources 就可以看到输出的 PDB 符号文件的体积比之前更大,原因是加上了源代码文件
在有嵌入源代码的符号文件,就可以在调试的时候,自动进入到源代码。但是和有源代码的调试不同的在于,此时的源代码是不支持更改逻辑的。另一个不足在于当前只支持 cs 等代码文件,还不支持 xaml 文件
此功能其实也是 SourceLink 的一个功能,需要 VisualStudio 2019 新版本才能支持。如果自己的代码是开源的,也可以通过 SourceLink 链接到 GitHub 等的方式,这样可以减少 NuGet 包的下载大小。详细请看 dotnet 使用 SourceLink 将 NuGet 链接源代码到 GitHub 等仓库
其实将源代码放入 PDB 文件会比使用 SourceLink 链接到 GitHub 上更好,原因是从 GitHub 上拉代码的速度不如下一个大的 NuGet 文件
更多关于 Roslyn 请看 手把手教你写 Roslyn 修改编译
博客园博客只做备份,博客发布就不再更新,如果想看最新博客,请访问 https://blog.lindexi.com/
如图片看不见,请在浏览器开启不安全http内容兼容

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名[林德熙](https://www.cnblogs.com/lindexi)(包含链接:https://www.cnblogs.com/lindexi ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我[联系](mailto:lindexi_gd@163.com)。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· 赶AI大潮:在VSCode中使用DeepSeek及近百种模型的极简方法
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地