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

.NET MAUI 8初始化主视图依赖注入时遇TargetInvocationException问题

问题描述

此前运行正常的页面代码如下:

public partial class SelectionPage : ContentPage
{
    private SelectionViewModel vm;

    public SelectionPage(SelectionViewModel viewmodel)
    {
       InitializeComponent();
       this.vm = viewmodel;
       BindingContext = viewmodel;
       viewmodel.PropertyChanged += Viewmodel_PropertyChanged;
    }
}

但在新设备或新模拟器上安装应用时,抛出异常:

System.Reflection.TargetInvocationException: 'Exception has been thrown by the target of an invocation.'

目前找到临时解决方法:注释掉// BindingContext = viewmodel;一行后可成功部署;部署完成后重新启用该行,应用即可正常运行。

排查思路
  • 优先查看InnerException:TargetInvocationException只是外层包装,真正的错误原因藏在InnerException中,捕获并打印该异常的详细信息,是定位问题的核心步骤。
  • 检查SelectionViewModel的初始化逻辑:设置BindingContext时会立即触发UI绑定,若ViewModel的构造函数或初始化代码中访问了仅在设备运行阶段可用的资源(如硬件API、未创建的本地文件、未授权的系统权限),部署阶段(模拟器/新设备首次安装初始化时)这些资源不可用,就会触发反射调用异常。
  • 验证XAML绑定表达式:检查页面XAML中是否存在绑定到ViewModel未初始化属性、不存在的属性/命令的情况,首次设置BindingContext时XAML会解析所有绑定,非法绑定可能引发异常。
  • 调整BindingContext设置时机:将BindingContext = viewmodel;移到页面的OnAppearing方法中,避免在页面构造阶段就触发绑定逻辑,测试是否还会出现部署错误。
  • 调换事件注册与BindingContext设置的顺序:先注册viewmodel.PropertyChanged += Viewmodel_PropertyChanged;,再设置BindingContext,避免绑定触发的属性变更在事件注册前发生导致未处理异常。
  • 核对设备/模拟器环境:确认新设备的SDK版本、应用权限配置是否与原运行环境一致,高版本SDK可能存在API行为变化,未配置的权限会导致ViewModel初始化时访问受限资源失败。

内容的提问来源于stack exchange,提问作者Gerhard Mauerberger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 03:34:58