Использование ссылочных сборок, условно основанных на версии ОС времени выполнения в 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 и других приложений.

0 ответов

Другие вопросы по тегам