【发布时间】:2017-11-11 10:58:43
【问题描述】:
我在另一个解决方案中创建并安装了一个 NuGet 包,但现在我需要在从我的新解决方案调用时调试包的代码。
我尝试引用包的解决方案,但它不起作用。
我正在使用 Visual Studio 2013。
【问题讨论】:
标签: c# visual-studio nuget nuget-package
我在另一个解决方案中创建并安装了一个 NuGet 包,但现在我需要在从我的新解决方案调用时调试包的代码。
我尝试引用包的解决方案,但它不起作用。
我正在使用 Visual Studio 2013。
【问题讨论】:
标签: c# visual-studio nuget nuget-package
要调试任何 dll,您需要它的符号文件 (.pdb)。如果您在 debug 配置中构建项目,您将看到这些文件已生成并放入构建输出文件夹中。
Visual Studio 从不同位置加载这些符号文件,如 here 所述。调试 nuget 包的最简单方法是将包的 .pdb 文件放在要调试的项目的构建输出文件夹中。
如果您尝试调试的代码被归类为非用户代码,您需要在调试选项中取消选中 Just My Code。
Microsoft - Visual Studio Docs 中的以下引用显示了哪些是用户代码,哪些是非用户代码。
用户和非用户代码
为了区分用户代码和非用户代码,Just My Code 查看 符号 (.pdb) 文件和程序优化。调试器认为 优化二进制文件或 .pdb 时的非用户代码 文件不可用。
三个属性也会影响调试器认为是我的 代码:
- DebuggerNonUserCodeAttribute 告诉调试器它应用的代码不是我的代码。
- DebuggerHiddenAttribute 对调试器隐藏代码,即使关闭了“仅我的代码”也是如此。
- DebuggerStepThroughAttribute 告诉调试器单步执行它所应用的代码,而不是单步执行代码。
所有其他代码都被视为用户代码。
更详细的答案可以在on my blog找到。
【讨论】:
nuget.symbols.nupkg 并将 pdb 转储到下载的 dll 旁边的 bin 目录中,取消选中 Enable just my code 即可进入我的 NuGet 包。我什至不需要将源文件添加到解决方案“调试源文件”面板中。我不明白为什么每个人都建议过分复杂的解决方案?为你的伴侣 +1!
Enable just my code 的信息。我已更新我的答案以包含此信息。
对于 Visual Studio 2017 和托管在 GitHub 或 BitBucket 上的 nuget 包源代码:
在 *.csproj 文件中启用完整的调试信息:
<PropertyGroup Condition="'$(Configuration)'=='Debug'">
<DebugType>full</DebugType>
<DebugSymbols>true</DebugSymbols>
</PropertyGroup>
或者右键项目属性,构建,高级,输出调试信息——设置为full。
要为您的 nuget 包 dll 启用自动源下载和步进,请将 nuget 包 SourceLink.Create.CommandLine 添加到您的项目中,或手动将其添加到 *.csproj 文件中:
<ItemGroup>
<PackageReference Include="SourceLink.Create.CommandLine" Version="2.8.2" PrivateAssets="All" />
</ItemGroup>
更多信息here。
在工具 - 选项 - 调试中,禁用“仅启用我的代码”,并启用“在模块加载时抑制 JIT 优化(仅限托管)”。
在此之后,您应该能够从您的 nuget 包 dll 中进入方法。
【讨论】:
Suppress JIT optimization on module load (Managed Only) 是做什么的?
我通过在调试模式下构建 nuget 包源自的项目,然后将 pdb 和 dll 从调试目录复制到我想要调试它的项目中的 nuget dll 的位置来完成这项工作。
例如复制自
ExternalNugetPackage\bin\Debug\
到
ProjectDirectory\Packages\ExternalNugetPackage.1.0.0\lib\net4.5
【讨论】:
如何调试我创建的 nuget 包中的代码
正如 NtFreX 回答的那样,“要调试任何 dll,您需要它的符号文件 (.pdb)。”。因此,您可以创建符号包,允许消费者在 Visual Studio 调试器中单步执行您的包代码。
我们的做法(和工作方式):
详细信息可以参考Creating symbol packages。
如果这些包不适合在 NuGet Gallery/SymbolSource 上发布,您可以将 *.nupkg 和 *.symbols.nupkg 文件放在本地磁盘上。
注意:将源代码添加到引用包的解决方案的Debug Source Files(右键单击Solution,选择Properties...Common Properties...Debug Source Files,并添加相关的根源目录二进制引用)
【讨论】: