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 修改编译
Roslyn 通过 EmbedAllSources 将源代码嵌入到 PDB 符号文件中方便开发者调试的更多相关文章
- 如何把Power BI嵌入到Web应用中
(此文章同时发表在本人微信公众号"dotNET开发经验谈",欢迎右边二维码来关注.) 题记:这篇其实不是一个操作向导了,主要对Power BI的嵌入特性进行探讨. Power BI ...
- QT QQuickView嵌入到QT MDI中
在学习QT的过程中发现有一个特别炫酷的行星例子“planets”,有两种实现版本: 一种是基于Qt 3D QML(planets-qml),另一种则是基于Quick和强大的Three.js(plane ...
- 将flex页面嵌入到jsp页面中
如果我们只需要用到Flex的一部分功能,例如播放器功能,我们可以单独把Flex页面嵌入到Jsp页面中.要想实现此功能,需要下载一个工程,将其覆盖在服务器根目录下即可.你可以在次下载:FlexModul ...
- Java与Flex学习笔记(20)---将flex页面嵌入到jsp页面中
如果我们只需要用到Flex的一部分功能,例如播放器功能,我们可以单独把Flex页面嵌入到Jsp页面中.要想实现此功能,需要下载一个工程,将其覆盖在服务器根目录下即可.你可以在次下载:FlexModul ...
- WPF:将Office文档、任意类型文件嵌入到EXE可执行文件中
原文:WPF:将Office文档.任意类型文件嵌入到EXE可执行文件中 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei198 ...
- PDB符号文件浏览工具介绍
一.SymView SymView工具用来显示符号文件中包含的符号表和符号数据.目前支持微软的Visual C/C++和C#编译器产生的DBG格式的符号文件和PDB格式的符号文件. SymView提供 ...
- PDB符号文件
一.什么是PDB文件 PDB(Program DataBase),全称为“程序数据库”文件.存储程序的所有调试信息数据.在编译连接时,如果选择了/debug选项或/debug:full选项,则最新的M ...
- 把任意的EXE嵌入到自己程序中
把任意的EXE嵌入到自己程序中 taoyuan19822008-08-24上传 Delphi把任意的EXE嵌入到自己程序中的程序 资源积分:0分 下载次数:327 资源类型:其他 资源大小:175 ...
- 如何把Qlik Sense嵌入到Web应用中
(此文章同时发表在本人微信公众号"dotNET开发经验谈",欢迎右边二维码来关注.) 题记:这是一个给初学者(尤其对VS不熟悉的BI工程师)的入门操作向导. Qlik Sense是 ...
- 在ASP.NET 5项目中使用和调试外部源代码包
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:由于在ASP.NET 5中,项目依赖都是通过"包"来引用,所以使用 ...
随机推荐
- 记录--记录用前端代替后端生成zip的过程,速度快了 57 倍!!!
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 业务场景: 产品有个功能是设置主题.类似手机自动切换壁纸,以及其他功能颜色,icon,字体等. 管理员需要在后端管理系统多次下载不同主题, ...
- gRPC入门学习之旅(三)
gRPC入门学习之旅(一) gRPC入门学习之旅(二) 2.3.创建自定义服务 除上面的模板中自带的一个gRPC服务之后,我们再创建一个自己的服务,我将创建一个用户信息gRPC服务,主要功能有三个,登 ...
- 开发必会系列:J2EE是什么
为什么Java是跨平台的? 高级语言通过编译器,转为汇编语言,汇编语言通过汇编器转为0和1. 当c转为汇编时,不同厂家cpu,用不同的指令集,所以有不同的汇编语言结果,导致c不能跨平台. java在各 ...
- 【K8S】如何进入kubernetes的一个pod
如何进入kubernetes的一个pod呢,其实和进入docker的一个容器相似: 进入docker容器 : docker exec -ti <your-container-name> / ...
- KingbaseES V8R6 空闲事务会话超时自动终止机制
背景 如果会话在事务中停留的时间过长,则允许自动终止空闲会话.可以由配置参数idle_in_transaction_session_timeout 事务处于空闲状态的时长,它有助于防止被遗忘的交易事务 ...
- 卷积神经网络学习笔记——ZFNet(Tensorflow实现)
完整代码及其数据,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/DeepLearningNote 这个网络应该是CNN的鼻 ...
- urllib+BeautifulSoup爬取并解析2345天气王历史天气数据
urllib+BeautifulSoup爬取并解析2345天气王历史天气数据 网址:东城历史天气查询_历史天气预报查询_2345天气预报 1.代码 import json import logging ...
- 4 JavaScript数组和对象
4 数组和对象 在JS中创建数组非常简单. 直接[ ]即可. 也可以用正规军的new Array(). 不过效果都是一样的. var as = [11,22,33,44,55]; var bs = n ...
- #阶梯NIM,树形dp#CF1498F Christmas Game
题目 Alice 和 Bob 在一棵 \(n\) 个点的树上玩游戏,第 \(i\) 个节点上有 \(a_i\) 个石子, 每轮可以选择一个深度至少为 \(k\) 的节点并移动任意多石子到其 \(k\) ...
- 《Spring 测试指南》:JPA、MockMvc 和 @SpringBootTest 详解
测试 Spring 提供了一组测试工具,可以轻松地测试 Spring 应用程序的各个组件,包括控制器.服务.存储库和其他组件.它具有丰富的测试注释.实用程序类和其他功能,以帮助进行单元测试.集成测试等 ...