Razor 运行时编译破坏了热重载,因此无法在 ASP.NET 中进行调试

Cod*_*ter 6 razor asp.net-core hot-reload visual-studio-2022

命名法

这个问题与三个相关主题有关,这些主题允许开发人员在正在运行的应用程序中引入代码更改,而无需重建和重新启动所述应用程序:

  • 编辑并继续:Visual Studio 修改正在调试的程序集的功能。您可以在断点上(在某些限制内)编辑托管代码,它会神奇地应用于调试对象。
  • 热重载:随 Visual Studio 2022 引入,有点像“编辑并继续”,支持托管代码的运行时重新编译,而无需在断点处暂停,甚至不必从一开始就运行调试器。
  • Razor 运行时编译:通过在保存 .cshtml 文件时重新编译来编辑正在运行的应用程序的 Razor 视图。

设置

下面描述的问题也会发生在这些组件的早期版本的组合上。然后:

  • 启动 Visual Studio 2022

  • 创建在 .NET 6 或 7 上运行的 ASP.NET Core Web 应用程序

  • 添加 NuGet 包 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

  • 将生成的 Program.cs 代码更改为以下内容以添加 Razor 运行时编译:

    // Add services to the container.
    var mvcBuilder = builder.Services.AddRazorPages();
    
    #if DEBUG
    mvcBuilder.AddRazorRuntimeCompilation();
    #endif
    
    Run Code Online (Sandbox Code Playgroud)

再生产

现在在任何视图中设置一个断点Index.cshtml就可以了,然后运行应用程序。

一旦到达断点,就更改一些 Razor 代码。或者不这样做,这些问题也会因打开(多个?).cshtml 文件而触发。

然后点击Ctrl+SF5应用您的更改并继续运行您的应用程序和 tada.wav:

你怎么敢

热重载无法自动应用您的更改。该应用程序需要重新构建才能应用更新。

或者,更改后面代码 (.cshtml.cs) 中的一些代码。现在,继续时您将收到随机 NullReferenceExceptions 或 ExecutionEngineExceptions。

解决方法

在开始调试会话之前关闭所有 .cshtml 文件。

问题

是否有可能:

  1. 得到一些确认,我不是唯一遇到这种情况的人?
  2. 有“编辑并继续”但没有“热重载”吗?这些设置似乎已经组合在一起,要么全有,要么全无。
  3. 使此操作(在调试时编辑 Razor 文件和 C# 代码)能够正常工作,而不会出现这些可怕的错误?
  4. 如何让 Microsoft 将取消键 ( Esc) 设置为继续编辑按钮?

Cod*_*ter 2

看来,在受影响的项目中安装 Razor 运行时编译 (Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation) 可以在很大程度上缓解此错误(尽管在尝试重现问题时,运行时仍然会偶尔抛出 NullReferenceException/ExecutionEngineException ) 。

由于热重载还会重新编译您的 Razor 视图,因此只需卸载 RuntimeCompilation 包,您就会得到更少的错误。

编辑:这并不完全正确,错误弹出窗口仍然会显示,尽管频率较低。