我正在尝试将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。