.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
相关产品推荐
相关产品推荐

