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

No symbols when attaching to .NET Core program (single file)

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

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

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

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

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

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

任何人都可以对此提供任何见解吗?或者可能的解决方案?

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

干杯

回答我自己的问题。

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

--self-contained 的问题在于它会修剪程序集以减小尺寸。

The trim-self-contained deployment model is a specialized version of the self-contained deployment model that is optimized to reduce deployment size.

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

However, there is a risk that the build time analysis of the application can cause failures at runtime, due to not being able to reliably analyze various problematic code patterns (largely centered on reflection use).

你可以阅读更多here

禁用 --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>
...

希望这对以后的人有所帮助。