C# WinForms调用UWP API时AppInfo抛出NotImplementedException
异常触发根因
你遇到的NotImplementedException不属于代码逻辑错误,是非打包WinForms应用调用通知监听器API时的系统层兼容限制:
- 不具备MSIX包身份的进程访问
UserNotification.AppInfo时,系统返回的是占位代理对象,所有涉及DisplayInfo等深层属性的访问逻辑会被直接拦截,抛出未实现异常 - 官方通知监听器的示例代码默认运行在具备完整包身份的环境下,未覆盖非打包桌面应用的兼容场景,直接照搬实现就会触发该问题
可行解决路径
- 方案1:绕开会抛异常的AppInfo深层属性,通过独立的包查询接口获取应用信息
- 优先读取
notification.AppInfo.Id属性,该值对应当前发送通知应用的PackageFamilyName,在非打包场景下不会触发异常 - 拿到PackageFamilyName后,调用系统包查询接口直接获取对应应用的完整信息,完全绕开会抛异常的AppInfo代理对象
可直接替换的代码参考:
try { // 该属性在非打包场景下可正常返回应用的PackageFamilyName var appPackageFamilyName = notification.AppInfo.Id; if (!string.IsNullOrEmpty(appPackageFamilyName)) { // 查询系统中对应包的完整信息 var targetPackage = Package.FindPackagesForUser(string.Empty, appPackageFamilyName).FirstOrDefault(); if (targetPackage != null) { this.source = targetPackage.DisplayName; } } } catch(NotImplementedException e) { this.source = "Unspecified"; } - 优先读取
- 方案2:为现有WinForms应用补充合法包身份
给当前项目套一层Windows应用包装项目,让进程运行时具备有效的PackageIdentity,无需修改现有业务代码。此时系统会为AppInfo对象返回正常的功能实现,你原本直接访问AppInfo.DisplayInfo.DisplayName的逻辑可以正常运行,不会抛出异常。
实操注意事项
- 调用系统包查询接口前,需要在应用的manifest文件中声明
packageQuery能力,否则会触发权限访问异常 - 不要通过反射强行读取AppInfo对象的内部私有字段绕开异常,该实现依赖系统内部结构,在Windows版本迭代后极易失效,稳定性极差
- 现有代码中解析通知Toast标题、正文的逻辑不受该问题影响,可以保持原有实现不变
内容的提问来源于stack exchange,提问作者Parquelle
相关产品推荐
相关产品推荐

