2019-5-29-Roslyn-让-VisualStudio-急速调试底层库方法
title | author | date | CreateTime | categories |
---|---|---|---|---|
Roslyn 让 VisualStudio 急速调试底层库方法
|
lindexi
|
2019-5-29 20:2:9 +0800
|
2019-05-29 18:34:27 +0800
|
VisualStudio
|
我有一个很大的项目,这个项目里面包含了很多小的底层库。有一天我发现了某个底层库可能有小伙伴挖了一个坑,我期望调试这个底层库,但是我一点都不想编译整个大项目,因为底层库被太多的项目应用,一点点修改都需要编译很久。本文提供一个简单的方法让大家可以通过修改项目文件,让 VisualStudio 可以急速调试底层库,每次更改底层库只需要重新编译底层库就可以
本文提供的方法和通过外部调试方法快速调试库代码 说到的方法几乎相同,只是通过上面文章的方法会让输出的时候带了底层库依赖的库文件会影响软件的正常运行
假设我有一个大的项目和一个底层库,大的项目是 BemjefearjiLebedayal 底层库是 FibiwhearweJukelerekalu 具体的代码我都放在 github 欢迎小伙伴关注
在 BemjefearjiLebedayal 大项目里面引用了底层库,在底层库里面我需要调试一个 Foo 的类
public class Foo
{
public string GetFoo()
{
return "林德熙是逗比";
}
}
在主项目的主函数是这样使用的
static void Main(string[] args)
{
var foo = new Foo();
Console.WriteLine(foo.GetFoo()); Console.Read();
}
我需要在 GetFoo 函数里面使用断点,我需要修改返回值,小伙伴使用的方法是先修改 GetFoo 方法里面的代码,然后点击启动大项目。这样就需要从底层库编译到主项目,需要等待很长的编译时间。不过小伙伴会在这段时间里面水了很多 QQ 群,所以我才会一天都看到一些小伙伴都在群里说话
从通过外部调试方法快速调试库代码 可以知道,想要让 VisualStudio 调试库的代码只需要将对应的 dll 文件和符号文件放在了需要调试的大项目的文件夹里面就可以了。
这个方法通过重定向输出文件夹可以做到,但是我的底层库会依赖很多特殊的库,这些库和主项目使用到的库可能不相同,此时重定向整个输出文件夹会让主项目无法进行调试
解决方法就是在编译完成的时候,通过MSBuild Copy 复制文件 将输出的库文件复制到主项目的文件夹,这样就可以做到每次更改只编译库的代码,提升了调试速度
右击 FibiwhearweJukelerekalu 底层库的csproj编辑文件,在 2019 可以通过双击进入编辑
<PropertyGroup>
<MainProjectPath>..\BemjefearjiLebedayal\bin\Debug\netcoreapp3.0\</MainProjectPath>
</PropertyGroup> <Target Name="CopyOutputLibToFastDebug" AfterTargets="AfterBuild">
<ItemGroup>
<OutputFileToCopy Include="$(OutputPath)$(AssemblyName).dll"></OutputFileToCopy>
<OutputFileToCopy Include="$(OutputPath)$(AssemblyName).pdb"></OutputFileToCopy>
</ItemGroup>
<Copy SourceFiles="@(OutputFileToCopy)" DestinationFolder="$(MainProjectPath)"></Copy>
</Target>
请将 MainProjectPath 里面的代码替换为你实际的项目的代码,请将上面代码放在底层库的项目文件里面
将会在编译完成的时候会将输出的文件从底层库的输出文件夹复制到 MainProjectPath 设置的文件夹
现在还差一步就是启动调试,通过右击底层库,点击属性,点击调试,点击可执行文件,输入主项目的启动程序
此时就可以在底层库里面点击运行进行调试,同时可以做二进制兼容的改动。关于二进制兼容请看VisualStudio 通过外部调试方法快速调试库代码
写到这里的代码已经放在 github 如果小伙伴还不知道上面的步骤,可以下载代码自己运行一下
当然每次都这样做还是比较不清真,因为编辑项目文件的时候的提示很少,很容易写错,所有的底层库写的代码都差不多,是不是可以做一个 NuGet 库帮助写代码
没错,我创建了项目 dotnet-campus/UsingMSBuildCopyOutputFileToFastDebug: 通过复制输出文件让 VisualStudio 外部启动快速调试底层库 Using MSBuild Copy Output File To Fast Debug 欢迎小伙伴关注
使用方法是
在需要调试的底层库项目安装 NuGet 库 dotnetCampus.UsingMSBuildCopyOutputFileToFastDebug
编辑底层库项目的 csproj 文件,添加下面代码
<PropertyGroup>
<MainProjectPath>主项目的输出文件夹</MainProjectPath>
</PropertyGroup>通过右击底层库属性,点击调试,设置为可执行文件,路径修改为主项目的启动程序。就可以在底层库点击调试运行主项目调试,同时支持打断点和进行二进制兼容的更改
请注意 主项目的输出文件夹 的路径最后使用 \
结束,如 C:\lindexi\doubi\
如果是将底层库放在其他文件夹,请将 主项目的输出文件夹 修改为实际的文件夹
2019-5-29-Roslyn-让-VisualStudio-急速调试底层库方法的更多相关文章
- Alpha冲刺(6/10)——2019.4.29
所属课程 软件工程1916|W(福州大学) 作业要求 Alpha冲刺(6/10)--2019.4.29 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪 ...
- VisualStudio 断点调试详解
本文详细告诉大家 VisualStudio 断点调试的功能和使用方法,本文使用的是最新 VisualStudio2019 的功能,也许在你看到这篇博客的时候这个版本已经过时 本文将会按照从简单到复杂, ...
- (C#)asp_net调试错误解决方法收集(1)
(C#)asp_net调试错误解决方法收集(1) 2007-11-2309:20 一.异常详细信息:System.InvalidOperationException:对于不返回任何键列信息的Selec ...
- vs2010的11个调试技巧和方法
调试是软件开发周期中很重要的一部分.它具有挑战性,同时也很让人疑惑和烦恼.总的来说,对于稍大一点的程序,调试是不可避免的.最近几年,调试工具的发展让很多调试任务变的越来越简单和省时. 这篇文章总结了可 ...
- Android 5.0 版本 USB 调试模式打开方法
Android 4.2 版本 USB 调试模式打开方法 1. 进入“设置”页面,点击“关于平板电脑”.见下图红色方框. 2. 疯狂点击“版本号”,见下图红色方框,直到出现“您现在处于开发者模式!” ...
- Angel - 模拟Kafka数据流调试FTRL的方法
Angel - 模拟Kafka数据流调试FTRL的方法 Mac或者Linux版本(Win10的Linux子系统同样适用) 创建一个目录用来安装kafka以及zookeeper等相关软件,比如,新建一个 ...
- jdbc调试sql语句方法
在main命令行输入三个参数到oracle 的 dept2表(自己建的 和dept一样(deptno,dname,loc)),插入到数据库中去.通过本例子,学习在java里调试sql的方法. 写完sq ...
- “全栈2019”Java多线程第八章:放弃执行权yield()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第六章:中断线程interrupt()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
随机推荐
- 后缀自动机求多串LCS——spojlcs2
/* 每个状态存最长匹配长度,然后多个串匹配过程中取最小的最长匹配长度 和LCS1不同的地方:LCS只要维护住当前匹配长度和最长匹配长度即可,但是多串匹配需要维护的是每个状态结点(即后缀树上)的信息 ...
- 带你走进webpack世界,成为webpack头号玩家。
最近朋友圈被<头号玩家>刷爆了,斯皮尔伯格一个资深电影导演,把对过去经典的致敬,对未来的憧憬浓缩在这一部电影中,可以说让观众燃了起来. 观望整个前端开发,不断的演化,发展迅速.前端开发从最 ...
- spring其他配置 (3)
目录 一.自动装配 Autowired 二.bean的作用于singleton,prototype 三.引入外部资源properties文件 四.SpEL表达式 (可以为属性进行动态的赋值) 五.通过 ...
- Qt无边框窗口的移动、拉伸边框、鼠标滚轮缩放大小
主要是处理窗口上鼠标的几个事件,具体代码请看下面的截图, 完整代码的下载链接在此:http://download.csdn.net/detail/beyond0824/9657110, 本示例代码中, ...
- Codeforces 1167C - News Distribution
题目链接:http://codeforces.com/problemset/problem/1167/C 题意:大概就是分成几个小团体,给每个人用1 - n编号,当对某个人传播消息的时候,整个小团体就 ...
- css中的zoom的作用
1.检查页面的标签是否闭合不要小看这条,也许折腾了你两天都没有解决的 CSS BUG 问题, 却仅仅源于这里.毕竟页面的模板一般都是由开发来嵌套的,而 他们很容易犯此类问题.快捷提示:可以用 Drea ...
- 2015年7个重要的Web设计趋势
Web设计趋势每一年都会有所变化.但设计师的创意天赋是推动改变网页设计标准的法则.如果在2015年,网页缺少以下7个设计元素,必定被淘汰~ 1.排版更灵活 这部分的主要焦点在于,字体展现会受到新兴排版 ...
- Codeforces 479【C】div3
题目链接:http://codeforces.com/problemset/problem/977/C 题意:给你n个数字,输出任意一个数字,这个数字刚好大于等于,序列里面k个数字. 题解:排个序,第 ...
- webpack的devtool
这里以环境分类为分析方向 1.对开发环境 eval - 每个模块都使用 eval() 执行,并且都有 //@ sourceURL.此选项会非常快地构建.主要缺点是,由于会映射到转换后的代码,而不是映射 ...
- 源码编译安装nginx详细步骤
1.下载nginx源码包并解压 可在http://nginx.org/en/download.html下载.tar.gz的源码包,如(nginx-1.4.7.tar.gz) 下载后通过tar -xvz ...