自我更新WPF应用程序,启动程序进程通过反射加载WPF应用程序

时间:2018-05-25 17:27:21

标签: c# wpf launcher

在Winforms应用程序中,我们开发了一个自我更新的应用程序启动器,我试图模仿WPF,但面临一些问题。这适用于Winforms的方式:

  • 启动程序(不参考主应用程序)将检查更新的库并在必要时下载
  • 然后Launcher将从STA线程加载程序集(Assembly.Load),然后通过反射,调用该程序集中的Init方法(执行一堆init逻辑,同时启动器充当启动屏幕并显示进度)
    • 在Init完成后,Laucher将通过加载程序集中的反射调用Handoff方法,该方法将使用新的MainForm创建一个新的ApplicationContext,然后调用Application.Run(newAppContext)。
    • 启动器将关闭其窗口

我试图在WPF中模仿相同但我遇到的问题:

  • 似乎没有ApplicationContext的概念,我可以将MainForm转移到
  • 我不确定如何处理App.xaml /资源,因为我无法使用"第二个" App.xaml在应用程序dll中,所以我不确定如何处理资源/样式的加载
  • 当我在" Handoff"中显示新的MainWindow时通过反射调用的调用,窗口短暂打开但随后消失

了解如何在Wpf应用程序中实现所需行为的任​​何指导。

2 个答案:

答案 0 :(得分:0)

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 );

答案 1 :(得分:0)

对于任何有趣的人来说,解决这个问题实际上是非常重要的:

  • 创建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();
    
  • 返回Launcher,关闭()Launcher窗口