6

Roslyn 通过 EmbedAllSources 将源代码嵌入到 PDB 符号文件中方便开发者调试

 3 years ago
source link: https://lindexi.gitee.io/post/Roslyn-%E9%80%9A%E8%BF%87-EmbedAllSources-%E5%B0%86%E6%BA%90%E4%BB%A3%E7%A0%81%E5%B5%8C%E5%85%A5%E5%88%B0-PDB-%E7%AC%A6%E5%8F%B7%E6%96%87%E4%BB%B6%E4%B8%AD%E6%96%B9%E4%BE%BF%E5%BC%80%E5%8F%91%E8%80%85%E8%B0%83%E8%AF%95.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
Roslyn 通过 EmbedAllSources 将源代码嵌入到 PDB 符号文件中方便开发者调试

咱造了一个轮子,咱可以非常方便将这个轮子库作为 NuGet 发布出去,造福其他开发者,或者毒害其他开发者。为什么说是毒害呢?因为有时候这个库存在坑,此时使用这个库的开发者就受到了伤害。为了安抚脆弱的开发者们,咱可以提高一下开发者们的调试效率,例如让开发者们可以调试到库里面的源代码 本文来告诉大家如何在项目文件里面添加上 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/post/Roslyn-%E9%80%9A%E8%BF%87-EmbedAllSources-%E5%B0%86%E6%BA%90%E4%BB%A3%E7%A0%81%E5%B5%8C%E5%85%A5%E5%88%B0-PDB-%E7%AC%A6%E5%8F%B7%E6%96%87%E4%BB%B6%E4%B8%AD%E6%96%B9%E4%BE%BF%E5%BC%80%E5%8F%91%E8%80%85%E8%B0%83%E8%AF%95.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者前往 CSDN 关注我的主页

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

无盈利,不卖课,做纯粹的技术博客

以下是广告时间

推荐关注 Edi.Wang 的公众号
lindexi%2F201985113622445

欢迎进入 Eleven 老师组建的 .NET 社区
lindexi%2F20209121930471745.jpg

以上广告全是友情推广,无盈利


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK