自更新 WPF 应用程序,启动器进程通过反射加载 WPF 应用程序
Self-updating WPF application, launcher process load WPF app via reflection
在 Winforms 应用程序中,我们开发了一个自我更新的应用程序启动器,我试图用 WPF 模仿相同的启动器,但遇到了一些问题。这与 Winforms 的工作方式:
- 启动程序(不引用主应用程序)将检查更新的库并根据需要下载
- Launcher 然后将从 STA 线程加载程序集 (Assembly.Load),然后通过反射调用该程序集中的 Init 方法(在启动器充当启动器时执行一系列初始化逻辑屏幕和显示进度)
- Init 完成后,Laucher 将在加载的程序集中通过反射调用 Handoff 方法,该方法将使用新的 MainForm 创建一个新的 ApplicationContext,然后调用 Application.Run(newAppContext)。
- 启动器将关闭其 Window
我试图在 WPF 中模仿同样的东西,但我遇到的问题:
- 似乎没有我可以将 MainForm 传输到的 ApplicationContext 的概念
- 我不确定如何处理 App.xaml/resources 因为我无法在应用程序 dll 中放入 "second" App.xaml,所以我不确定如何处理处理 resources/styles
的加载
- 当我在通过反射调用的 "Handoff" 调用中显示一个新 MainWindow 时,window 短暂打开但随后消失
感谢任何关于我如何在 Wpf 应用程序中实现所需行为的指导。
WPF 应用派生自 System.Windows.Application 的基础 class。 VS 使用的基本模板创建一个 App.xaml 和 App.xaml.cs。此 class 的静态入口点为
public static void Main()
这是我用的:
var type = yourloadedassembly.GetType( "YourNamespace.App" );
type.InvokeMember( "Main", BindingFlags::Public | BindingFlags::Static | BindingFlags::InvokeMethod, null, null, null );
对于任何有趣的人来说,解决这个问题实际上是微不足道的:
- 创建 Wpf 应用程序(启动器)
- 创建一个 "Application" 程序集(可以是一个 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();
回到启动器,Close()启动器window
在 Winforms 应用程序中,我们开发了一个自我更新的应用程序启动器,我试图用 WPF 模仿相同的启动器,但遇到了一些问题。这与 Winforms 的工作方式:
- 启动程序(不引用主应用程序)将检查更新的库并根据需要下载
- Launcher 然后将从 STA 线程加载程序集 (Assembly.Load),然后通过反射调用该程序集中的 Init 方法(在启动器充当启动器时执行一系列初始化逻辑屏幕和显示进度)
- Init 完成后,Laucher 将在加载的程序集中通过反射调用 Handoff 方法,该方法将使用新的 MainForm 创建一个新的 ApplicationContext,然后调用 Application.Run(newAppContext)。
- 启动器将关闭其 Window
我试图在 WPF 中模仿同样的东西,但我遇到的问题:
- 似乎没有我可以将 MainForm 传输到的 ApplicationContext 的概念
- 我不确定如何处理 App.xaml/resources 因为我无法在应用程序 dll 中放入 "second" App.xaml,所以我不确定如何处理处理 resources/styles 的加载
- 当我在通过反射调用的 "Handoff" 调用中显示一个新 MainWindow 时,window 短暂打开但随后消失
感谢任何关于我如何在 Wpf 应用程序中实现所需行为的指导。
WPF 应用派生自 System.Windows.Application 的基础 class。 VS 使用的基本模板创建一个 App.xaml 和 App.xaml.cs。此 class 的静态入口点为
public static void Main()
这是我用的:
var type = yourloadedassembly.GetType( "YourNamespace.App" );
type.InvokeMember( "Main", BindingFlags::Public | BindingFlags::Static | BindingFlags::InvokeMethod, null, null, null );
对于任何有趣的人来说,解决这个问题实际上是微不足道的:
- 创建 Wpf 应用程序(启动器)
- 创建一个 "Application" 程序集(可以是一个 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();
回到启动器,Close()启动器window