Hot Reload 在 .NET 6+ 中默认启用但仅限 ASP.NET Core、WPF、WinForms、MAUI(.NET 7+ 含控制台部分变更)项目;不支持类库、发布模式及主入口/结构变更,需用 dotnet watch 或 VS 2022 Hot Reload 启动,仅允许方法体内修改。

Hot Reload 在 .NET 6+ 中默认启用,但仅对特定项目类型生效
Hot Reload 不是“改完代码自动重跑整个程序”,它只在调试会话中、针对支持的变更类型做增量更新。.NET SDK 6.0.100+ 默认集成 dotnet watch 和运行时热重载能力,但前提是你用的是 ASP.NET Core、WPF、WinForms 或 MAUI 项目(.NET 7+ 支持控制台应用的部分变更)。纯 .NET Class Library 或未启用调试的发布模式下,Hot Reload 完全不工作。
常见误判:改了 Program.cs 主入口逻辑后没反应——这是正常现象,因为主方法签名/结构变更属于“不支持热重载”的范畴;而改 Controller 方法体、XAML 绑定表达式或 Blazor 组件内的 @code 块,通常能立即生效。
启动 Hot Reload 的两种可靠方式
最常用且兼容性最好的方式是使用 dotnet watch,它会自动检测文件变化并触发热重载(或必要时重启):
- 确保项目 SDK 版本 ≥
Microsoft.NET.Sdk.Web(或其他支持 SDK),并在.csproj中确认没有禁用:<EnableDefaultCompileItems>false</EnableDefaultCompileItems> - 终端执行:
dotnet watch(不是dotnet run) - 修改代码保存后,终端会输出类似
watch : Hot reload of changes succeeded或提示需重启
另一种是 VS 2022(17.0+)中点击“开始调试”按钮旁的小箭头 → 选择 Start Hot Reload(仅限支持的项目模板)。注意:此模式下断点可能无法在热重载后命中,调试体验不如 dotnet watch 稳定。
哪些代码变更能热重载,哪些会失败
热重载不是万能补丁。运行时只能注入 IL 修改,因此以下操作会被拒绝并提示 Hot reload failed:
- 添加/删除类、方法、字段(结构变更)→ 触发完整重启
- 修改方法签名(参数增删、返回类型变更)、泛型约束 → 不支持
- 改动
static构造函数、global using、AssemblyInfo.cs内容 → 无法注入 - 在
Program.cs中新增中间件注册(如app.UseMiddleware<MyLog>())→ 需重启 - 但允许:修改方法内部逻辑、字符串字面量、
if条件、LINQ 表达式体、属性get实现等
VS 或终端里看到 Hot reload failed: Method 'xxx' has been added 这类错误,说明你动了运行时无法 patch 的边界——别硬试,直接 Ctrl+C 再 dotnet watch 重来。
调试时热重载与断点、变量观察的冲突点
热重载生效后,当前调用栈中的方法不会被替换(避免栈错乱),所以你在某行打了断点,热重载后该断点仍指向旧版本 IL。结果就是:新代码已运行,但断点停不下来,Locals 窗口显示的仍是旧变量状态。
应对策略很实际:
- 热重载后,手动在新代码位置重新设断点(尤其在刚改过的
if分支或新Console.WriteLine行) - 避免在热重载频繁的开发阶段依赖“断点步进”验证逻辑,改用
Console.WriteLine或Debug.WriteLine输出关键值 -
dotnet watch --verbose可查看每次变更是否被接受、哪类节点被跳过,比盲猜更省时间
真正容易被忽略的是:热重载不等于热调试。它解决的是“改 UI/业务逻辑后快速预览”,而不是“边调边改”。一旦涉及控制流大幅调整或状态初始化变动,重启仍是最快路径。










