You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:05:16