ASP.NET中Razor运行时编译导致Hot Reload失效及调试异常
术语说明
本文涉及三项可让开发者在运行中应用程序里修改代码、无需重建重启的相关功能:
- Edit and Continue:Visual Studio的调试中修改程序集功能,可在断点处(受部分限制)编辑托管代码并自动应用到调试目标。
- Hot Reload:随Visual Studio 2022推出,类似Edit and Continue,无需断点暂停或调试器运行即可实现托管代码运行时重编译。
- Razor Runtime Compilation:通过保存.cshtml文件时重编译,实现运行中编辑Razor视图的功能。
环境配置
- Visual Studio 2022(17.4.4版本)
- .NET 7(SDK:7.0.102)或.NET 6(SDK:6.0.403)
- NuGet包:Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
上述组件的更早版本组合也会出现下述问题。配置步骤:
- 启动Visual Studio 2022
- 创建基于.NET 6或7的ASP.NET Core Web应用
- 添加Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet包
- 修改自动生成的Program.cs代码以启用Razor运行时编译:
// Add services to the container. var mvcBuilder = builder.Services.AddRazorPages(); #if DEBUG mvcBuilder.AddRazorRuntimeCompilation(); #endif
问题复现
在任意视图(如Index.cshtml)中设置断点并运行应用程序。
断点触发后修改Razor代码,或仅打开多个.cshtml文件,也会触发问题。
按下Ctrl+S保存并按下F5继续运行,会出现提示:
Hot Reload无法自动应用更改,需重建应用以更新。
若修改.cshtml.cs中的代码,继续运行时会随机出现NullReferenceException或ExecutionEngineException异常。
临时解决方案
启动调试会话前关闭所有.cshtml文件。
咨询问题
- 是否有其他开发者遇到同样问题?
- 能否单独启用“Edit and Continue”而不启用“Hot Reload”?两者设置似乎绑定,只能同时开启或关闭。
- 如何实现在调试时编辑Razor文件和C#代码而不出现上述错误?
- 如何建议Microsoft将
Esc键设置为“继续编辑”按钮的快捷键?
内容的提问来源于stack exchange,提问作者CodeCaster
相关产品推荐
相关产品推荐


