在 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 支持 |
---|---|---|---|
控制台 | ✅ | .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 服务器 | .NET 6 | .NET 6 | .NET 6 |
Blazor WebAssembly | .NET 6 | .NET 6 | .NET 6 |
毛 伊 岛 (WinUI/Android/iOS) |
.NET 6 | -- | -- |
可以使用热重载进行的编辑类型由运行时和编译器版本决定,而不是由用于启动应用程序的方法(F5 或 Ctrl+F5)决定。
在以下部分中,我们提供了其他详细信息。
支持C++应用程序
使用 Visual Studio 2022 并使用调试器启动应用时,可以使用 热重载 按钮在调试器(F5)下运行时热重载本机C++应用程序。 使用 CMake 和 OpenFolder 项目生成的应用也支持热重载。
要使项目支持热重载,需要设置以下选项:
- “项目”>“属性”>“C/C++”>“常规”>“调试信息格式”必须设置为“用于‘编辑并继续’的程序数据库
/ZI
” - 项目 > 属性 > 链接器 > 常规 >启用增量链接 必须设置为“是
/INCREMENTAL
”
有关支持的编辑,请参阅 C++ 支持的代码更改。
使用调试器时,将 Visual Studio 2022 与 .NET 应用配合使用
使用 Visual Studio 2022 并使用调试器启动应用时,热重载适用于大多数应用框架。
在你拥有 .NET 且使用 Visual Studio 托管调试器的任何地方,你都应获得基本的热重载支持。 这一事实意味着即使是 Azure Functions 等项目在此方案中也非常出色。
注意
默认情况下,某些项目使用混合模式调试,不支持热重载。 您可以在项目设置中修改此设置,方法是将 项目 > 属性 > 调试 > 打开调试启动配置文件 UI > 启用原生代码调试 设置为 false。
将 Visual Studio 2022 与 .NET 应用配合使用,但不使用调试器
面向大多数类型的 .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 调试器时有效,并适用于以前热重载可用的任何地方。 有关更具体的指导,请参阅 .NET 对 ASP.NET Core的热重载支持。
对于面向 .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 上使用响应压缩,请参阅有关 响应压缩的信息。