附加到 .NET Core 程序时没有符号(单个文件)

Gon*_*ira 5 c# .net-core .net-5 .net-core-publishsinglefile

为了更好地解释,我将提供一些背景信息。

我有一个在运行时动态加载库的应用程序。该库是某种插件,应用程序旨在测试该插件。

为了能够调试插件,我使用插件项目打开 VS Code,并将调试器附加到已运行且已加载插件的应用程序。插件程序集已构建并具有一个不错的 PDB 文件。

所以工作流程如下:Application => load plugin => attach debugger

首先,即使应用程序已发布,这也是有效的。这是因为加载的插件是在调试中内置的,因此 PDB 就在那里。

但是,在某些情况下,我似乎无法正确附加或未加载符号。这是如果我发布带有该/p:PublishSingleFile=true标志的应用程序的话。在这种情况下,会生成一个文件,当我尝试附加调试器时,它不起作用。

谁能对此提供任何见解?或者一个可能的解决方案?

值得一提的是,我正在使用 .NET 5

干杯

Gon*_*ira 7

回答我自己的问题。

/p:PublishSingleFile=true从 .NET Core 3.0 开始,默认情况下使用该标志假定--self-contained true. 这是有道理的,如果您将所有内容打包到一个文件中,您可能也需要 .NET 运行时。

问题--self-contained是它会修剪组件以减小尺寸。

修剪独立部署模型是独立部署模型的专门版本,经过优化以减少部署规模。

因此,在反射使用(例如动态加载程序集)方面,存在一些可能导致运行时行为不当的风险。

然而,由于无法可靠地分析各种有问题的代码模式(主要集中在反射使用),应用程序的构建时分析可能​​会导致运行时失败。

你可以在这里阅读更多。

禁用--self-contained可以解决问题,并且我能够将调试器附加到单文件应用程序。我通过添加<SelfContained>false</SelfContained>到项目文件来做到这一点。

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
    <SelfContained>false</SelfContained>
    <PublishSingleFile>true</PublishSingleFile>
  </PropertyGroup>
...
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助将来的人。