【发布时间】:2018-11-05 03:36:57
【问题描述】:
在一个 Winforms 应用程序中,我们开发了一个自我更新的应用程序启动器,我正在尝试用 WPF 来模仿它,但遇到了一些问题。这与 Winforms 的工作方式:
- 启动器进程(不参考主应用程序)将检查更新的库并根据需要下载
- Launcher 然后将从 STA 线程加载程序集 (Assembly.Load),然后通过反射,在该程序集中调用 Init 方法(在启动器充当启动屏幕并显示进度时执行一堆初始化逻辑)
- Init 完成后,Laucher 将通过加载程序集中的反射调用 Handoff 方法,该方法将使用新的 MainForm 创建一个新的 ApplicationContext,然后调用 Application.Run(newAppContext)。
- 启动器将关闭其窗口
我试图在 WPF 中模仿相同的方法,但我遇到了问题:
- 似乎没有我可以将 MainForm 转移到的 ApplicationContext 概念
- 我不确定如何处理 App.xaml/resources,因为我无法在应用程序 dll 中放置“第二个”App.xaml,因此我不确定如何处理资源/样式的加载李>
- 当我在通过反射调用的“Handoff”调用中显示一个新的 MainWindow 时,窗口会短暂打开,然后消失
感谢有关如何在 Wpf 应用程序中实现所需行为的任何指导。
【问题讨论】:
-
为什么不直接使用 ClickOnce?任务完成。无论如何,有什么代码要显示吗?
-
除了 ClickOne,我之前的做法比您建议的更容易,只是制作一个单独的应用程序进行更新。让您的应用程序检查,
Process.Start您的更新程序,关闭应用程序,更新程序执行操作,然后重新启动您的应用程序。这相当简单、直接,并且无法覆盖正在运行/正在使用的 .exe 或 .dll。 -
System.Windows.Application.Run(mainWindow),这是一个实例方法
-
我想问一下,为什么不使用 Process.Start 将其作为普通可执行文件启动并为其提供命令行参数以进行切换?您的另一个选择是使用 AppDomain ExecuteAssembly 函数之一。
-
@JoelLucsy 请参阅:Launcher 将从 STA 线程加载程序集 (Assembly.Load),然后通过反射,在该程序集中调用 Init 方法(在启动器时执行一堆初始化逻辑正在充当启动屏幕并显示进度) - 启动器在初始化时查询加载的程序集并接收状态更新,因此 Process.Start 将不起作用