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

时间:2018-07-16 14:41:03

标签: c# visual-studio .net-core .net-4.6 .net-standard-2.0

我正在使用Visual Studio2017。我创建了一个具有两个目标框架 netstandard2.0的 .NET Standard 库(让该库为 Lib1 )项目。 net46 。然后,我还有另外两个项目...一个是“纯” .strong .NET Framework 4.6 控制台项目(简称为 Console46 )和一个 .NET Core < / strong>控制台项目(简称为 ConsoleCore )。他们两个都引用了Lib1。

运行ConsoleCore项目时,可以毫无问题地调试和放置断点,但是运行Console46时,Visual Studio无法加载pdb文件,因此无法调试库,放置断点等。< / p>

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

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

谢谢!

2 个答案:

答案 0 :(得分:3)

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

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

最终对我有用的是诱使VS2019使用Full Framework Debugger。

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

请注意:

  • 占位符应用程序无法执行任何操作,也永远不会真正运行。
  • 它不需要引用您要调试的其他.NET Standard程序集。
  • 无论如何,“ Foo.exe”都是调试过程,但是只有在Startup Project是Framework项目时才会出现断点,而在Startup Project设置为其中之一时,断点才被命中。 NET Standard项目在相同的解决方案中。

如前所述,顺便说一句,将“ Build \ Advanced \ Debugging information”设置为“ Full”对我的情况没有影响,但是谢谢您的理解,确实值得一试!

答案 1 :(得分:1)

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

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

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

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