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 设置的文件夹

现在还差一步就是启动调试,通过右击底层库,点击属性,点击调试,点击可执行文件,输入主项目的启动程序

2019-5-29-Roslyn-让-VisualStudio-急速调试底层库方法_库文件

此时就可以在底层库里面点击运行进行调试,同时可以做二进制兼容的改动。关于二进制兼容请看​​VisualStudio 通过外部调试方法快速调试库代码​

写到这里的代码已经放在 ​​github​​ 如果小伙伴还不知道上面的步骤,可以下载代码自己运行一下

当然每次都这样做还是比较不清真,因为编辑项目文件的时候的提示很少,很容易写错,所有的底层库写的代码都差不多,是不是可以做一个 NuGet 库帮助写代码

没错,我创建了项目 ​​dotnet-campus/UsingMSBuildCopyOutputFileToFastDebug: 通过复制输出文件让 VisualStudio 外部启动快速调试底层库 Using MSBuild Copy Output File To Fast Debug​​ 欢迎小伙伴关注

使用方法是

  1. 在需要调试的底层库项目安装 NuGet 库 ​​dotnetCampus.UsingMSBuildCopyOutputFileToFastDebug​
  2. 编辑底层库项目的 csproj 文件,添加下面代码

    <PropertyGroup> <MainProjectPath>主项目的输出文件夹</MainProjectPath> </PropertyGroup>
  3. 通过右击底层库属性,点击调试,设置为可执行文件,路径修改为主项目的启动程序。就可以在底层库点击调试运行主项目调试,同时支持打断点和进行二进制兼容的更改

请注意 主项目的输出文件夹 的路径最后使用 ​​\​​​ 结束,如 ​​C:\lindexi\doubi\​​ 如果是将底层库放在其他文件夹,请将 主项目的输出文件夹 修改为实际的文件夹

​VisualStudio 通过外部调试方法快速调试库代码​

​Roslyn 如何使用 MSBuild Copy 复制文件​