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

MAUI启动时UserDialogs抛出System.Reflection.TargetInvocationException错误求助

解决Controls.UserDialogs.Maui依赖注入失败问题

问题定位与修复方案

1. 调整服务注册顺序

你的代码中UseUserDialogs()的调用位置没问题,但必须确保它在注册ViewModel或依赖它的服务之前执行。UseUserDialogs()的核心作用是向DI容器注册IUserDialogs服务,如果先注册ViewModel再调用它,容器里还没有这个服务,就会触发解析失败。

检查RegisterServices(startupSpecific)方法是否包含ViewModel或依赖它的服务注册,调整为以下顺序:

var builder = MauiApp.CreateBuilder();
builder
    .UseMauiApp<App>()
    .ConfigureFonts(fonts =>
    {
        // 注册字体
    })
    .UseUserDialogs() // 先注册UserDialogs服务
    .RegisterServices(startupSpecific); // 再注册依赖它的ViewModel等服务

2. 手动显式注册服务(备用方案)

如果UseUserDialogs()未自动完成注册,直接手动向DI容器添加服务注册:

builder.Services.AddSingleton<IUserDialogs, UserDialogs>();

将这行代码放在.UseUserDialogs()之后,或者直接替换.UseUserDialogs(),确保服务被正确注入容器。

3. 排查版本与平台配置

  • 确认安装的Controls.UserDialogs.Maui是最新稳定版,避免版本兼容问题。
  • 检查平台专属配置:
    • Android:无需额外初始化,但确保MainApplication.cs中没有冲突的初始化逻辑。
    • iOS:确认Info.plist中没有权限配置冲突(该包通常无需额外权限)。

4. 验证服务注册状态

在构建容器后,可以临时添加验证代码,确认服务是否成功注册:

var host = builder.Build();
var userDialogs = host.Services.GetService<IUserDialogs>();
if (userDialogs == null)
{
    // 服务未注册,需回溯前面的注册步骤
}

核心原因解析

Unable to resolve service for type 'Controls.UserDialogs.Maui.IUserDialogs'错误本质是DI容器中找不到对应服务实现,常见触发场景:

  • UseUserDialogs()调用时机过晚,ViewModel注册时容器还未加载该服务。
  • 包初始化逻辑异常,未自动完成服务注册。
  • 项目残留旧版Acr.UserDialogs的IUserDialogs接口,导致注入时命名空间匹配错误。

内容的提问来源于stack exchange,提问作者Mark Vermulst

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 21:07:06