本文来告诉大家如何在项目文件里面添加上 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 修改编译

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

  1. 如何把Power BI嵌入到Web应用中

    (此文章同时发表在本人微信公众号"dotNET开发经验谈",欢迎右边二维码来关注.) 题记:这篇其实不是一个操作向导了,主要对Power BI的嵌入特性进行探讨. Power BI ...

  2. QT QQuickView嵌入到QT MDI中

    在学习QT的过程中发现有一个特别炫酷的行星例子“planets”,有两种实现版本: 一种是基于Qt 3D QML(planets-qml),另一种则是基于Quick和强大的Three.js(plane ...

  3. 将flex页面嵌入到jsp页面中

    如果我们只需要用到Flex的一部分功能,例如播放器功能,我们可以单独把Flex页面嵌入到Jsp页面中.要想实现此功能,需要下载一个工程,将其覆盖在服务器根目录下即可.你可以在次下载:FlexModul ...

  4. Java与Flex学习笔记(20)---将flex页面嵌入到jsp页面中

    如果我们只需要用到Flex的一部分功能,例如播放器功能,我们可以单独把Flex页面嵌入到Jsp页面中.要想实现此功能,需要下载一个工程,将其覆盖在服务器根目录下即可.你可以在次下载:FlexModul ...

  5. WPF:将Office文档、任意类型文件嵌入到EXE可执行文件中

    原文:WPF:将Office文档.任意类型文件嵌入到EXE可执行文件中 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei198 ...

  6. PDB符号文件浏览工具介绍

    一.SymView SymView工具用来显示符号文件中包含的符号表和符号数据.目前支持微软的Visual C/C++和C#编译器产生的DBG格式的符号文件和PDB格式的符号文件. SymView提供 ...

  7. PDB符号文件

    一.什么是PDB文件 PDB(Program DataBase),全称为“程序数据库”文件.存储程序的所有调试信息数据.在编译连接时,如果选择了/debug选项或/debug:full选项,则最新的M ...

  8. 把任意的EXE嵌入到自己程序中

    把任意的EXE嵌入到自己程序中 taoyuan19822008-08-24上传   Delphi把任意的EXE嵌入到自己程序中的程序 资源积分:0分 下载次数:327 资源类型:其他 资源大小:175 ...

  9. 如何把Qlik Sense嵌入到Web应用中

    (此文章同时发表在本人微信公众号"dotNET开发经验谈",欢迎右边二维码来关注.) 题记:这是一个给初学者(尤其对VS不熟悉的BI工程师)的入门操作向导. Qlik Sense是 ...

  10. 在ASP.NET 5项目中使用和调试外部源代码包

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:由于在ASP.NET 5中,项目依赖都是通过"包"来引用,所以使用 ...

随机推荐

  1. 【干货】Java开发者快速上手.NET指南

    前言 前几天有小伙伴在技术群里发了一个微软官方出的:适用于Java开发人员的.NET快速入门免费电子书,今天大姚来分享一下Java开发者想要快速上手.NET有哪些教程和优质资料. 微软适用于Java开 ...

  2. 常用命令--htpasswd--(网站加密)

    常用命令htpasswd(网站加密) 常用选项 htpasswd 是一个用于创建和管理HTTP基本认证密码文件的命令行工具,通常与Apache Web服务器一起使用.以下是 htpasswd 常用选项 ...

  3. 基于proteus的数字电路设计

    基于proteus的数字电路设计 1.实验原理 proteus的数字电路仿真能力还是比较强大的.这里总结一下proteus的几个基本操作以备后用.大致包括74hc系列的使用.常用调试设备.仿真开关.器 ...

  4. CVS Excell乱码怎么修改

    问题描述 日常办公,从网页或者其他web端下载的表格(excel格式或csv格式),打开后发现中文乱码,如下: 常规解法 百度会发现,大部分提供的方法,就是通过excel的另存为,然后选择相应的编码, ...

  5. Linux命令行常用命令(一)

    ls 命令,展示文件夹内内容 -R :连同子目录内容一起列出来: -S :以档案容量大小排序! -t :依时间排序 cd 命令 cd /root/Docements # 切换到目录/root/Doce ...

  6. Java 日期和时间 API:实用技巧与示例 - 轻松处理日期和时间

    Java 用户输入(Scanner) 简介 Scanner 类用于获取用户输入,它位于 java.util 包中. 使用 Scanner 类 要使用 Scanner 类,请执行以下步骤: 导入 jav ...

  7. C++执行Linux命令

    一.执行简单命令 比如需要创建文件.文件夹.删除文件 #include <iostream> #include <stdio.h> #include <stdlib.h& ...

  8. Python smtp发送邮件怎么设置抄送人

    设置抄送人,非常简单,只需要添加一条信息就可以了,例: cc_list = ['xx@xxx.cn', 'xx@xxx.cn'] msg['Cc'] = ','.join(cc_list) smtp. ...

  9. 如何使用 Grafana 监控文件系统状态

    当 JuiceFS 文件系统部署完成并投入生产环境,接下来就需要着手解决一个非常重要的问题 -- 如何实时监控它的运行状态?毕竟,它可能正在为关键的业务应用或容器工作负载提供持久化存储支持,任何小小的 ...

  10. 什么是token,为什么需要token

    1.为什么需要token 随着互联网的发展,为了更安全,以及更好的用户体验,逐渐产生了token这个技术方案 之所以使用token是因为http/https协议本身是无状态的,不能进行信息的存储 (c ...