调试未在.NET Framework标准项目中加载的符号

jja*_*rdo 11 c# visual-studio .net-core .net-4.6 .net-standard-2.0

我正在使用Visual Studio 2017.我使用两个Target框架netstandard2.0net46创建了一个.NET标准库(让这个库成为Lib1)项目.然后我有另外两个项目......一个是"纯粹的" .NET Framework 4.6控制台项目(我们称之为Console46)和一个.NET Core控制台项目(我们称之为ConsoleCore).他们都引用了Lib1.

当我运行ConsoleCore项目时,我可以调试并放置断点而没有任何问题,但是当我运行Console46时,Visual Studio无法加载pdb文件,因此我无法调试库,放置断点等.

我尝试手动加载PDB文件,因为它是为net46创建的,但它也失败了.

我该怎么做才能解决这个问题?

谢谢!

Dan*_*iel 11

评论中发布的答案@hans-passant 是一个很好的解决方案。

我在 csproj 文件中使用此选项重建了我的 .NET-Core 库。以下是在您按照 @hans-passant 的说明修改文件时添加到 csproj 的片段(项目 > 属性 > 构建选项卡 > 高级按钮。将“调试信息”组合框从便携式更改为完整):

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <DebugType>full</DebugType>
    <DebugSymbols>true</DebugSymbols>
  </PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

然后我将构建的dll和转储pdbbin我的 .NET-Framework 应用程序的目录中,并且我能够进入我的 .NET-Core 代码。


IV.*_*IV. 4

这是一个成功的解决方法,可以解决与您所描述的非常相似的问题。当我的“解决方案”仅包含 .NET Standard 项目并且我尝试使用外部 4.6.1 Framework 可执行文件(让我们从单独的解决方案中将其称为“Foo.exe”)进行调试时,我的断点也没有命中。

我的理解是,有两种不同的调试器:.NET Core 调试器和完整框架调试器。我的与“解决方案”默认为前者,因为这是其中唯一的项目类型。

最终对我有用的是欺骗 VS2019 使用完整框架调试器。

为此,我向解决方案添加了占位符 4.6.1 Framework 控制台项目,并将其设置为启动项目。在“调试”选项卡中,我将“启动操作”设置为完全相同,将“启动外部程序”中的值指向与之前相同的值(“Foo.exe”)。现在断点起作用了。

为了清楚起见,注释:

  • 占位符应用程序不执行任何操作,并且从未实际运行过。
  • 它不需要引用您尝试调试的其他 .NET Standard 程序集。
  • “Foo.exe”是在任何情况下都会附加的调试进程,但只有当启动项目是框架项目时才会触发断点,而不是当启动项目设置为 .NET Standard 项目之一时才会触发断点在同一个解决方案中。

顺便说一句,如之前的帖子中所述,将“Build\Advanced\Debugging information”设置为“Full”在我的场景中没有什么区别,但谢谢你,它很有意义,并且值得一试!