Использование ссылочных сборок, условно основанных на версии ОС времени выполнения в WPF
Я экспериментирую с интеграцией Центра уведомлений / действий Windows 10 в существующее приложение WPF (.NET Framework 4.7.2), которое должно работать на уровне ниже Windows 7. Приложение устанавливается через MSI WiX.
Приложение использует Prism+Unity для внедрения зависимостей.
Решение (упрощенное для целей вопроса) имеет три проекта:
App.WPF
- точка входа для приложения WPF и дом для просмотра / управления
App.WPF.Win10
- Содержит необходимые ссылки и код для уведомлений Win10
App.WPF.Core
- Содержит модели представления с зависимостями, внедренными через Unity
App.WPF
ссылки как App.WPF.Win10
а также App.WPF.Core
,
App.WPF.Win10
только ссылки App.WPF.Core
и содержит DesktopNotificationManagerCompat
как указано в примере уведомления о тостах на рабочем столе, который можно найти на github. Поскольку эта сборка использует API-интерфейсы Win10 UWP, она содержит ссылки на Win10 SDK, а также пару других сборок, используемых только для уведомлений Win10.
В оформлении контейнера либо Windows 10 NotificationManager
реализация (App.WPF.Win10
) или пустышка (App.WPF.Core
) из INotificationManager
абстракция (App.WPF.Core
) регистрируется в контейнере в зависимости от версии операционной системы. Это позволяет коду, использующему уведомления, не беспокоиться о проверке того, безопасны ли они, чтобы попробовать и использовать уведомления.
Регистрационный код выглядит примерно так:
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
предоставляются App.WPF.Win10
проект, на который ссылается App.WPF
, а также Core.NotificationManager
обеспечивается App.WPF.Core
,
Если я установлю WiX для установки всех ссылочных dll (даже для Win10) на Windows 7, все будет работать нормально, правильно NotificationManager
регистрируется и все работает отлично; Я действительно не хочу развертывать специфичные для Win10 двоичные файлы на компьютерах, где они не нужны, хотя их можно избежать.
Затем я настроил WiX для развертывания App.WPF.Win10
компонент (и необходимые зависимости), условно, исходя из версии ОС устанавливаемой машины. Установщик развертывает правильную полезную нагрузку, но в Windows 7 (где двоичные файлы не развернуты) запуск приложения не выполняется из-за FileNotFoundException
во время регистрации контейнера, вызванной попыткой загрузки среды выполнения App.WPF.Win10
собрание в пункте вызова RegisterTypes
потому что среда выполнения может видеть типы из потенциально используемой сборки.
Можно ли написать RegisterTypes
или настройте решение / проект таким образом, чтобы среда выполнения не пыталась загрузить App.WPF.Win10
сборка, если это действительно не нужно, то есть ОС времени выполнения Windows 10 TH1+.
Я также хотел бы избежать создания нескольких сборок и MSI для Win 10 и других приложений.