MAUI Windows中使用WeakReferenceMessenger报错:找不到WinRT.Runtime程序集
MAUI Windows 切换WeakReferenceMessenger后WinRT.Runtime程序集加载异常解决方案
问题描述
在MAUI Windows应用中,将动态修改标题栏颜色的实现从已弃用的MessagingCenter切换为WeakReferenceMessenger后,抛出异常:
- 内部异常:无法加载程序集'WinRT.Runtime, Version=2.1.0.0',系统找不到指定文件
- 异常消息:“'
'的类型初始值设定项引发异常”
解决步骤
1. 统一CommunityToolkit.Mvvm包版本
WeakReferenceMessenger属于CommunityToolkit.Mvvm库,需确保共享项目和Windows项目的该包版本完全一致,建议更新至最新稳定版,避免版本不兼容引发的依赖冲突。
2. 补充WinRT相关依赖包
右键Windows项目 → 管理NuGet程序包,搜索并安装Microsoft.Windows.SDK.Contracts包,该包会自动引入正确的WinRT.Runtime依赖,解决找不到程序集的问题。也可直接修改Windows项目的.csproj文件,添加以下引用:
<PackageReference Include="Microsoft.Windows.SDK.Contracts" Version="10.0.22621.755" />
(版本号可根据项目适配的Windows SDK版本调整)
3. 调整AppViewModel的初始化时机
当前在App.xaml.cs的OnLaunched方法中直接实例化AppViewModel,可能因初始化时机过早导致依赖未就绪。改为通过依赖注入方式获取实例:
- 修改
MauiProgram.cs,添加AppViewModel的单例注入:
public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder.UseSharedMauiApp(); builder.UseMauiCommunityToolkit(); builder.UseMauiCameraView(); builder.ConfigureMauiHandlers(handlers => { handlers.AddHandler(typeof(FormsWebView), typeof(FormsWebViewRenderer)); }); builder.Services.AddSingleton<IPhoneFeatureService, UWPPhoneFeatureService>(); // 注入AppViewModel单例 builder.Services.AddSingleton<AppViewModel>(); return builder.Build(); }
- 修改
App.xaml.cs的OnLaunched方法:
protected override void OnLaunched(LaunchActivatedEventArgs args) { base.OnLaunched(args); // 从服务容器获取已初始化的AppViewModel var appViewModel = Services.GetService<AppViewModel>(); this.Resources["AppViewModel"] = appViewModel; }
4. 确保消息处理在UI线程执行
MAUI中UI属性更新必须在主线程进行,WeakReferenceMessenger的回调可能在后台线程触发,需手动切换到UI线程:
修改AppViewModel的消息注册代码:
using Microsoft.Maui.Dispatching; // ... public AppViewModel(IDispatcher dispatcher) { WeakReferenceMessenger.Default.Register<WeakReferenceMessage>(this, async (r, m) => { await dispatcher.DispatchAsync(() => { TitleBarColor = m.Value.TitleBarColor; TitleColor = m.Value.TitleColor; }); }); }
注:MAUI默认已支持IDispatcher的依赖注入,无需额外配置。
5. 清理重建项目
- 右键解决方案 → 清理解决方案
- 删除各项目下的
bin和obj文件夹 - 重新生成解决方案,清除旧依赖缓存
内容的提问来源于stack exchange,提问作者D.madushanka
相关产品推荐
相关产品推荐

