我的应用程序安装在世界各地类似ATM的机器上。它是一个WPF应用程序,需要在后台自动更新,根本不需要用户交互。
现在我们正在使用Click-Once静默安装API,它运行得很好。我们目前的功能不断在幕后检查是否有新版本,如果有,它会更新应用程序,等待机器空闲(5分钟内不受任何用户影响),然后重新启动应用程序。重新启动后,将加载一个新版本。
有没有一种方法我可以使用MSI实现这一切?以下是我需要的东西的摘要:
-
所有机器的远程和静默更新-我已经知道我可以使用LogMeIn和MSIEXEC实现这一点(所以不需要回答这个问题)
-
在应用程序运行时更新应用程序,而不重新启动它。
-
仅当应用程序处于空闲状态5分钟时,才重新启动应用程序并运行新版本。
有什么建议吗?如果不是MSI,那么任何其他安装程序可能?我不能使用clickonce,因为我想在WindowsEmbedded8中将我的应用程序设置为Shell(而不是cmd.exe)。
这是一个有趣的高可用性故事,我可以想办法解决它,虽然MSI可以工作,但它并不是一个真正的安装程序问题。
我会创建两个安装程序:ContentManager和Application
CM一旦完成,几乎不会改变。它的工作是检查可用的更新和应用程序的空闲状态。当更新可用且应用程序空闲时,它可以在后台执行新的应用程序静默并排安装。注意,我说过安装而不是升级。现在您已经安装了两个版本的应用程序。当旧应用程序仍报告空闲时,它可能会关闭并启动新版本。
这将是高度可用的,MSI不需要知道任何关于该场景的信息。它只是执行一次安装。
如果你不需要这么高可用性,那么另一件需要考虑的事情是Windows安装程序支持"重新启动管理器"。您的WPF应用程序也可以。您的应用程序可以检查更新并启动升级。然后,重新启动管理器交互将在升级期间停止并重新启动您的应用程序。
HA解决方案的好处是您的旧版本仍然存在。内容管理器可以通过运行旧版本的应用程序来撤销更改。
@Christopher Painter,感谢您的回复。一些想法:
高可用性解决方案的基础很好,但它需要我们自己实施太多的东西。对于这种情况,有几件事你没有提到:1。如果下载失败会发生什么,如果解压缩失败会发生哪里,安装完成后我需要卸载以前的版本,我需要自己实现一些安全措施(散列"版本xml"或类似的东西…)共享资源锁定怎么样?我也需要自己处理。。。点击一次可以很好地处理所有这些东西。哦,还有一件事我想避免的是维护两个应用程序,而不是像你建议的那样维护一个。我不能太依赖"Manager",所以我不支持远程更新它。然而,我可以使用"推送"方法来使用LogMeIn激活MSI——它可以让我上传并向所有机器(AMT)发送命令。Restart Manager解决方案对我来说是可行的。我唯一还没有弄清楚的是,我是否可以让它拖到应用程序空闲,以及拖多长时间(它必须有某种超时)。我还研究了MSI自定义操作,它可以等待共享互斥("dle")。你觉得怎么样?