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