代码之家  ›  专栏  ›  技术社区  ›  rcbevans

在wpf中根据运行时os版本有条件地使用引用的程序集

  •  0
  • rcbevans  · 技术社区  · 7 年前

    我正在尝试将windows 10通知/操作中心集成到现有的wpf应用程序(.net framework 4.7.2)中,该应用程序需要运行到windows 7的底层。应用程序是通过wix msi安装的。

    应用程序使用prism+unity进行依赖注入。

    解决方案(为问题的目的而简化)有三个项目:

    App.WPF -wpf应用程序的入口点和视图/控件的主页

    App.WPF.Win10 -包含Win10通知所需的引用和代码

    App.WPF.Core -包含viewmodels,通过unity注入依赖项

    美国专利协会 同时引用 应用程序wpf.win10 小精灵

    应用程序wpf.win10 仅供参考 App.WPF.Cype ,并包含 DesktopNotificationManagerCompat 如桌面烤面包通知示例中提供的,可以 found on github . 由于此程序集使用win10uwpapi,因此它引用了win10 sdk,以及一些仅用于win10 notifications的其他程序集。

    在容器中注册Windows 10 NotificationManager 实施( 应用程序wpf.win10 )或虚拟( App.WPF.Cype 的) INotificationManager 抽象( 小精灵 )在容器中注册,基于运行时操作系统版本。这允许使用通知的代码不必担心检查尝试和使用通知是否安全。

    注册代码如下:

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        ....
    
        if (WindowsRelease >= WindowsRelease.TH1)
        {
           NotificationActivator.Application = this;
           containerRegistry.RegisterSingleton<INotificationManager, Win10.NotificationManager>();
        }
        else
        {
            containerRegistry.RegisterSingleton<INotificationManager, Core.NotificationManager>();
        }
    
        ...
    }
    

    Win10.NotificationManager NotificationActivator 应用程序wpf.win10 项目,由 美国专利协会 Core.NotificationManager 由提供 小精灵

    如果我将wix设置为在windows 7上安装所有引用的dll(甚至是win10特定的dll),那么一切看起来都很好,正确的 通知经理 注册后一切正常运行;如果可以避免,我不想在不需要win10特定二进制文件的计算机上部署它们。

    然后我将wix配置为部署 应用程序wpf.win10 组件(和必要的依赖项),有条件地,基于安装计算机操作系统版本。安装程序正在部署正确的负载,但在Windows 7(未部署二进制文件)上,由于 FileNotFoundException 在由运行时尝试加载 应用程序wpf.win10 调用点的程序集 RegisterTypes ,因为运行时可以看到程序集中的类型 潜在地 被使用。

    有可能写 注册表类型 方法或配置解决方案/项目,使运行时不会尝试加载 应用程序wpf.win10 程序集,除非它是真正需要的,即运行时操作系统是windows 10 th1+。

    我也希望避免生成多个版本和针对win 10和其他版本的msi。

    0 回复  |  直到 7 年前
    推荐文章