关于 maui-hot-reload-diagnostics
用于排查 .NET MAUI 应用 Hot Reload 故障的诊断技能。它区分 XAML 与 C# 问题,并提供配置、编码、框架特定行为及重启要求的检查方法。
主要功能
- 01XAML 与 C# 故障分类
- 02Debug 配置检查
- 03UTF-8 with BOM 编码验证
- 04框架特定指导
- 05需重启的编辑参考
- 06Hot Reload 日志诊断
适用场景
- 01诊断保存后更改未生效
- 02排查不支持的编辑或 rude edit
- 03解决 iOS XAML 热重载问题
- 04检查 Blazor Hybrid 的重启要求
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ davidortinau/ maui-skills --skill maui-hot-reload-diagnostics安装后在 Claude Code 中输入/maui-hot-reload-diagnostics确认已加载。
附带文件references/hot-reload-setup.mdscripts/diagnose-hot-reload.sh
详细介绍
.NET MAUI 热重载诊断
系统地诊断 .NET MAUI 应用的热重载故障。
快速诊断清单
- 确定故障类型:XAML 热重载(修改
.xaml)还是 C# 热重载(修改.cs) - 检查运行配置:必须使用 Debug 配置,并通过 F5 启动且附加调试器
- 保存文件并重新执行代码路径:C# 修改需要重新触发相应代码
- 检查热重载输出:查看 > 输出 >“Hot Reload”(VS)或“C# Hot Reload”(VS Code)
⚠️ 文件编码要求
重要:所有 .cs 文件都必须使用带 BOM 的 UTF-8 编码。
# Check if file has BOM (should show "UTF-8 Unicode (with BOM)")
file -I *.cs
# Find files without BOM
find . -name "*.cs" -exec sh -c 'head -c 3 "$1" | od -An -tx1 | grep -q "ef bb bf" || echo "$1"' _ {} \;
# Fix: convert to UTF-8 with BOM
sed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' file.cs
# Or in VS Code: Open file > Save with Encoding > UTF-8 with BOM
常见问题及修复方法
“保存时没有任何反应”
- 确认使用的是 Debug 配置(而非 Release)
- 检查热重载输出中的错误
- 确保文件已保存(而不只是修改)
- 重新执行代码路径(再次导航、再次点击按钮)
“不支持的编辑” / “不兼容的编辑”
某些修改始终需要重启应用:
- 添加或删除方法、字段、属性
- 更改方法签名
- 修改静态构造函数
- 修改泛型
XAML 修改未生效(iOS)
- ⚠️ 在 iOS 构建设置中将 Linker 设为 Don't Link
- 配置名称必须准确为 Debug
- 不要使用
XamlCompilationOptions.Skip
修改已生效,但 UI 未更新
- 对于 C#:必须重新触发代码(重新导航、再次点击)
- 检查是否存在缓存的绑定值或状态
- 确认编辑的是正确目标框架对应的文件
特定框架的注意事项
MauiReactor v3+
<ItemGroup Condition="'$(Configuration)'=='Debug'">
<RuntimeHostConfigurationOption Include="MauiReactor.HotReload" Value="true" Trim="false" />
</ItemGroup>
// ❌ Wrong — v2 API, remove for v3+
.EnableMauiReactorHotReload()
⚠️ 如果从 MauiReactor v2 迁移,请从 MauiProgram.cs 中移除 EnableMauiReactorHotReload() 调用。
C# Markup(CommunityToolkit.Maui.Markup)
要点——缺少以下任意一项都会导致热重载失效:
- ⚠️ 将 UI 构建逻辑提取到单独的
Build()方法中 - ⚠️ 在需要刷新的任何页面/视图上实现
ICommunityToolkitHotReloadHandler - C# 热重载后会自动调用
OnHotReload()方法 - 必须在
MauiProgram.cs中调用.UseMauiCommunityToolkitMarkup()
Blazor Hybrid 的限制
以下修改始终需要重启:
- 添加新组件
- 修改
@inject服务 - 静态资源修改(图像、字体)
- 修改
Program.cs或MauiProgram.cs
以下修改通常无需重启即可生效:
- Razor 标记和 C# 代码块修改
- CSS 修改(如果有缓存,可能需要硬刷新)
- 更改组件参数
⚠️ CSS 隔离:如果 .razor.css 修改未生效,请确认隔离 CSS 文件已正确链接。
决策指南——应使用哪种热重载类型?
| UI 方式 | 重载内容 | 注意事项 |
|---|---|---|
| XAML | .xaml 文件(即时生效) | iOS 上必须关闭 Linker;配置必须为“Debug” |
| C# 代码隐藏 | 仅方法体 | 必须重新触发代码路径;不兼容的编辑需要重启 |
| MauiReactor v3+ | 组件重新渲染 | 需要 RuntimeHostConfigurationOption,而不是代码调用 |
| C# Markup | Build() 方法体 | 必须实现 ICommunityToolkitHotReloadHandler |
| Blazor Hybrid | .razor + .css | 添加新组件/服务需要重启 |
调试技巧
- ⚠️ 始终先检查热重载输出窗口——其中会明确说明修改被拒绝的原因。
- 在启动 IDE 前,使用环境变量启用详细日志(参见
references/hot-reload-setup.md)。 - 二进制日志(
dotnet build -bl:build.binlog)有助于诊断与构建相关的热重载故障。 - 报告 Bug 时,请附上:
dotnet --info、工作负载列表、二进制日志和热重载输出。
快速检查清单
- 已选择 Debug 配置(而非 Release)
- 已附加调试器(F5,而非 Ctrl+F5)
- 所有
.cs文件均为带 BOM 的 UTF-8 编码 - 已检查热重载输出窗口中的错误
- C# 修改后已重新触发代码路径
- MauiReactor:
.csproj中包含RuntimeHostConfigurationOption(而非代码调用) - C# Markup:已实现
ICommunityToolkitHotReloadHandler - Blazor Hybrid:未修改服务/启动代码
评论
支持 Markdown