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多 ...
随机推荐
- 【Codeforces Round #429 (Div. 2) B】 Godsend
[Link]:http://codeforces.com/contest/841/problem/B [Description] 两个人轮流对一个数组玩游戏,第一个人可以把连续的一段为奇数的拿走,第二 ...
- P2004 领地选择
P2004 领地选择 题目描述 作为在虚拟世界里统帅千军万马的领袖,小Z认为天时.地利.人和三者是缺一不可的,所以,谨慎地选择首都的位置对于小T来说是非常重要的. 首都被认为是一个占地C*C的正方形. ...
- P1613 跑路(倍增)
P1613 跑路(倍增) 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十 ...
- 10.2 External interrupt/event controller (EXTI)
EXTI控制器的主要特点如下: 每个中断/事件线上的独立触发器和掩码 每个中断行的专用状态位 生成最多20个软件事件/中断请求 脉冲宽度小于APB2时钟周期的外部信号检测. 每条中断线路的专用状态位生 ...
- 文本数据增量导入到mysql
实现思路: 实现Java读取TXT文件中的内容并存到内存,将内存中的数据和mysql 数据库里面某张表数据的字段做一个比较,如果比较内存中的数据在mysql 里存在则不做处理,如果不存在则 ...
- linux下使用scp在服务器之间拷贝文件 (转载)
CentOS, 本地服务器,ip: 192.168.1.111Ubuntu, 远程服务器,ip: 192.168.1.112 1.拷贝远程服务器的目录到本地服务器远程服务器192.168.1.112上 ...
- 分道扬镳 /// 邻接表 DFS 剪枝 oj1332
题目大意: 编号为1…N 的N个城市之间以单向路连接,每一条道路有两个参数:路的长度和通过这条路需付的费用. Bob和Alice生活在城市1,但是当Bob发现了Alice玩扑克时欺骗他之后,他决定与她 ...
- 正版STlink的使用注意
https://blog.csdn.net/xinghuanmeiying/article/details/78026561
- flink widow&window funcion&水印
在定义了窗口分配器之后,我们需要为每一个窗口明确的指定计算逻辑,这个就是窗口函数要做的事情, 当系统决定一个窗口已经准备好执行之后,这个窗口函数将被用来处理窗口中的每一个元素(可能是 分组的). 谁可 ...
- linux段位进阶
1.青铜: 1.Linux基础知识.基本命令(起源.组成.常用命令如cp.ls.file.mkdir等常见操作命令) 2.Linux用户及权限基础 3.Linux系统进程管理进阶 4.linux高效文 ...