Самообновляющееся приложение WPF, приложение запуска процесса загрузки WPF через отражение - PullRequest
0 голосов
/ 25 мая 2018

В приложении Winforms мы разработали самообновляющуюся панель запуска приложений, и я пытаюсь повторить то же самое с WPF, но сталкиваюсь с некоторыми проблемами.То, как это работает с Winforms:

  • Процесс запуска (без ссылки на основное приложение) будет проверять наличие новых библиотек и загружать при необходимости
  • Затем запускается загрузка сборки (Assembly).Загрузите) из потока STA, а затем с помощью отражения вызовите метод Init в этой сборке (который выполняет набор логики init, пока модуль запуска выступает в качестве заставки и отображает прогресс)
    • После завершения Init,Laucher вызовет метод Handoff через отражение в загруженной сборке, который создаст новый ApplicationContext с новой MainForm, а затем вызовет Application.Run (newAppContext).
    • Launcher закроет свое окно

Я пытаюсь повторить то же самое в WPF, но у меня возникают следующие проблемы:

  • Похоже, не существует концепции ApplicationContext, которую я мог бы передатьMainForm для
  • Я не уверен, как обращаться с App.xaml / resources, так как я не могу поместить «второй» App.xaml вdll приложения, поэтому я не уверен, как обрабатывать загрузку ресурсов / стилей
  • Когда я показываю новое MainWindow в вызове "Handoff", который вызывается с помощью отражения, окно открывается на короткое время, но затем исчезает

Цените любые рекомендации о том, как я могу реализовать желаемое поведение в приложении Wpf.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Для всех, кому интересно, решить это было довольно тривиально:

  • Создать Wpf-приложение (модуль запуска)
  • Создать сборку «Приложение» (может быть dll), котораяразмещает точку входа для кода вашего приложения
  • Пусковая установка загружает сборку приложения динамически (Assembly.Load)
  • В вашей сборке приложения есть некоторая статическая точка входа, которую можно вызвать с помощью отраженияиз модуля запуска.
  • Когда средство запуска вызывает метод точки входа с помощью отражения, добавьте свои ресурсы и новое MainWindow из сборки приложения, чтобы назначить его для Application.Current.MainWindow:

       Application.Current.Resources = new ResourceDictionary() {Source = new Uri("pack://application:,,,/MyApp.UI.Styling;component/Common.xaml")};
       Application.Current.MainWindow = new MainWindow();
       Application.Current.MainWindow.Show();
    
  • Вернитесь в панель запуска, закройте () окно программы запуска

0 голосов
/ 26 мая 2018

Приложения WPF являются производными от базового класса System.Windows.Application.Базовый шаблон, который использует VS, создает App.xaml и App.xaml.cs.Этот класс имеет статическую точку входа

public static void Main()

Это то, что я использую:

var type = yourloadedassembly.GetType( "YourNamespace.App" );
type.InvokeMember( "Main", BindingFlags::Public | BindingFlags::Static | BindingFlags::InvokeMethod, null, null, null );
...