You need to enable JavaScript to run this app. C# WinForms调用UWP API时AppInfo抛出NotImplementedException
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForms调用UWP API时AppInfo抛出NotImplementedException

异常触发根因

你遇到的NotImplementedException不属于代码逻辑错误,是非打包WinForms应用调用通知监听器API时的系统层兼容限制:

  • 不具备MSIX包身份的进程访问UserNotification.AppInfo时,系统返回的是占位代理对象,所有涉及DisplayInfo等深层属性的访问逻辑会被直接拦截,抛出未实现异常
  • 官方通知监听器的示例代码默认运行在具备完整包身份的环境下,未覆盖非打包桌面应用的兼容场景,直接照搬实现就会触发该问题
可行解决路径
  • 方案1:绕开会抛异常的AppInfo深层属性,通过独立的包查询接口获取应用信息
    1. 优先读取notification.AppInfo.Id属性,该值对应当前发送通知应用的PackageFamilyName,在非打包场景下不会触发异常
    2. 拿到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 20:06:02