在 Visual Studio(C#、Visual Basic、C++)中使用热重载编写和调试正在运行的代码
从 Visual Studio 2022 开始,Visual Studio 中的热重载体验适用于托管 .NET 和本机 C++ 应用。 无论使用哪种类型的应用,热重载的目的都是尽可能节省编辑之间的应用重启次数,从而使你通过减少等待应用重新生成、重启、重新导航到你在应用中的上一个位置等操作的时间来提高工作效率。
为此,可以编辑应用程序的代码文件并将代码更改立即应用于正在运行的应用程序,也称为“热重载”。 应用更改后,通过在应用中执行操作(或通过某种计时器等)再次重新执行代码并立即查看更改;不需要通过断点暂停应用!
使用热重载更新正在运行的代码
使用 F5 或 Ctrl+F5(如果支持)来启动附加了调试器的应用。
打开代码文件更改代码。
使用“热重载”按钮或按 ALT+F10 应用代码更改。
若要查看用户界面中的更改,需要重新执行代码。 例如,必须重新执行按钮的代码隐藏或者通过计时器按某一间隔触发的代码。 再例如,由于 MetadataUpdateHandler 功能,ASP.NET Core 支持自动刷新浏览器。
支持 .NET 应用程序
- 使用 Visual Studio 2022 和启动具有调试器的应用时,基本热重载体验适用于大多数类型的 .NET 应用和框架版本。 这包括 .NET Framework、.NET Core 和 .NET 5+(适用于 C# 和 Visual Basic)。 此方案中的预期是,如果使用的是调试器,则假设热重载可用并进行尝试!
- 使用 Visual Studio 2022 但不使用调试器(例如,使用 CTRL-F5 启动应用)时,面向大多数类型的 .NET 6 应用,热重载也可用。 这意味着不面向 .NET 6(.NET 5 或更低版本)的应用将不支持“无调试器”方案,并且必须使用调试器来获得热重载支持。
- 将 Visual Studio 2022 与 .NET 6 应用一起使用时,支持大多数方案。 这不限于上述新的“无调试器”功能。 它还包括其他新功能,例如支持热重载 Blazor 项目,更一般地说,在任何 ASP.NET Core 应用中编辑 Razor 文件,以及 CSS 热重载。 将 Visual Studio 2022 与面向 .NET 6 的应用一起使用,可让你获得最强大的热重载体验。
下表显示了按照 Visual Studio 2022 (17.8) 中支持所需的最低.NET 版本,哪些项目在附加调试器 (F5) 和不附加调试器 (Ctrl+F5) 的情况下支持 .NET 热重载。
应用程序类型 | F5 | Ctrl+F5 | MetadataUpdateHandler 支持 |
---|---|---|---|
Console | ✅ | .NET 6 | .NET 6 |
在 Linux/macOS 上运行 (Docker 和 WSL) |
.NET 8 | .NET 6 | .NET 8 |
在 Arm64 上运行 | .NET 7 | .NET 7 | .NET 7 |
WPF | ✅ | .NET 6 | .NET 6 |
WinForms | ✅ | .NET 6 | .NET 6 |
ASP.NET | ✅ | .NET 6 | .NET 6 |
Blazor Server | .NET 6 | .NET 6 | .NET 6 |
Blazor WebAssembly | .NET 6 | .NET 6 | .NET 6 |
MAUI (WinUI/Android/iOS) |
.NET 6 | -- | -- |
可以使用热重载进行的编辑类型由运行时和编译器版本决定,而不是由用于启动应用程序的方法(F5 或 Ctrl+F5)决定。
在以下部分中,我们将对上述摘要进行扩展,并深入了解更多详细信息。
支持 C++ 应用程序
使用 Visual Studio 2022 并启动具有调试器的应用时,可以使用“热重载”按钮热重载在调试器 (F5) 下运行的本机 C++ 应用。 使用 CMake 和 OpenFolder 项目生成的应用也支持热重载。
为了使项目支持热重载,需要:
- “项目”>“属性”>“C/C++”>“常规”>“调试信息格式”必须设置为“用于‘编辑并继续’的程序数据库
/ZI
” - “项目”>“属性”>“链接器”>“常规”>“启用增量链接”必须设置为“是
/INCREMENTAL
”
有关支持的编辑,请参阅 C++ 支持的代码更改。
使用 .NET 应用同时使用调试器的 Visual Studio 2022
使用 Visual Studio 2022 和启动具有调试器的应用时,热重载适用于大多数应用框架。
在你拥有 .NET 且使用 Visual Studio 托管调试器的任何地方,你都应获得基本的热重载支持。 这一事实意味着,即使是 Azure Functions 之类的项目在此方案中也非常成功。
注意
某些项目默认使用不支持热重载的混合模式调试。 可以在项目设置中修改此项,方法是将“项目”>“属性”>“调试”>“打开调试启动配置文件 UI”>“启用本机代码调试”设置为 false。
使用 .NET 应用但不使用调试器的 Visual Studio 2022
当面向大多数类型的 .NET 6+ 应用时,热重载在没有调试器的情况下可用。
此功能专用于 .NET 6+。 那些不面向 .NET 6+(即面向 .NET 5 或更低版本)的应用将不支持“无调试器”方案,并且必须使用调试器才能访问热重载功能。
另外,请注意,并非所有项目类型目前都支持“无调试器”方案,请参阅支持 .NET 应用程序。
使用 .NET 6+ 应用的 Visual Studio 2022
如果同时使用 Visual Studio 2022 和面向 .NET 6+ 的应用,则可以获得最精美且功能强大的热重载体验。
在此方案中受支持:
- Blazor 应用(服务器和 WebAssembly)
- 在 Blazor 和常规 ASP.NET Core 网站中编辑 Razor 文件
- CSS 热重载
- XAML 热重载
- 在没有调试器的情况下运行应用程序时支持热重载(更多详情如前所述)
如果你面向的是 .NET 6+,将继续在即将推出的 Visual Studio 2022 更新和 .NET 功能区段和主要版本中获得改进。
支持的 ASP.NET Core 方案
许多 ASP.NET 方案都支持基本的热重载体验。 最广泛可用的功能是能够为大多数类型的 Web 应用程序更改代码隐藏和其他 .NET 类文件。 此功能在使用 Visual Studio 调试器时有效,并且出现在以前可以使用热重载的任何位置。 若需要更具体的指导,请参阅 ASP.NET Core 的 .NET 热重载支持。
对于面向 .NET 6+ 的 ASP.NET Core 开发人员,还有一些其他功能不适用于较低版本的 .NET。 这些功能包括:
- CSHTML:编辑 Razor CSHTML 文件支持多种类型的编辑。
- 浏览器刷新:编辑 razor 文件将在调试时自动在 Web 浏览器中刷新更改。 此功能以前仅在没有调试器的情况下启动应用时可用。
- CSS 热重载:可以在应用运行时更改 CSS 文件,键入的更改将立即应用到正在运行的应用。
- 无调试器:使用 Visual Studio 在没有调试器的情况下启动 Web 应用 (CTRL-F5) 时,可以获得热重载支持。
支持的 .NET 更改
.NET 热重载体验通过调试器和 C# 编译器 (Roslyn) 提供支持。 Roslyn 支持的编辑和受支持的代码更改(C# 和 VB)列出了当前支持的编辑类型以及未来可能的增强功能。
不支持的 .NET 项目
热重载在某些项目配置中不可用:
- 如果在不使用调试器的情况下使用 Visual Studio,则热重载仅适用于面向 .NET 6+ 的 .NET 应用。
- 如果使用 Visual Studio 调试器来运行应用,但在设置中禁用了
Enable Hot Reload and Edit and Continue when debugging
,则不支持热重载。 - 不支持版本或自定义生成配置。 你的项目必须使用
Debug
生成配置。 - 如果面向的是 F# 或 .NET Native 项目。
- .NET 热重载不支持某些启动或编译优化。 例如,如果项目的调试配置文件是通过以下方式配置的,则不支持 .NET 热重载:
- 为你的项目启用了修整。 例如,如果在调试配置文件的项目文件中将
PublishTrimmed
设置为 True,则不支持热重载。 - 为你的项目启用了 ReadyToRun。 例如,如果在调试配置文件的项目文件中将
PublishReadyToRun
设置为 True,则不支持热重载。
- 为你的项目启用了修整。 例如,如果在调试配置文件的项目文件中将
有关更多详细信息,请参阅不支持的方案。
配置热重载
要启用、禁用或配置“热重载”,请参阅配置“编辑并继续”。
警告消息
如果看到以下对话框,则热重载无法在不重启的情况下应用当前编辑。 可以选择重新生成应用,并应用更改(重启),或者继续编辑。 如果重新生成,则所有应用程序状态都将丢失。 如果继续编辑,其他更改或更正可能导致热重载再次运行。
如果在对话框中选择“无法应用更改时始终重新生成”选项,则不会在当前 Visual Studio 会话中再次看到该对话框,并且 Visual Studio 将自动重新生成和重新加载,而不是显示对话框。
疑难解答
强烈建议查看“热重载输出”窗口,以获取有关热重载会话的详细诊断信息。
如果对 .NET Core 使用响应压缩,请参阅有关响应压缩的信息。