0

我的应用程序安装在世界各地的类似 ATM 的机器上。它是一个 WPF 应用程序,需要在后台自动更新,完全不需要用户交互。

现在我们正在使用 Click-Once 静默安装 API,它运行良好。我们当前的功能会在后台不断检查是否有新版本,如果存在,它会更新应用程序,等待机器空闲(5 分钟内没有任何用户接触),然后才重新启动应用程序。重新启动后,将加载新版本。

有没有办法我可以使用 MSI 来实现这一切?这是我需要的摘要:

  1. 所有机器的远程和静默更新 - 我已经知道我可以使用 LogMeIn 和 MSIEXEC 来实现这一点(所以不需要回答这个问题)

  2. 在应用程序运行时更新它,而无需重新启动它。

  3. 仅在应用程序空闲 5 分钟后重新启动应用程序并运行新版本。

有什么建议么?如果不是 MSI,那么可能还有其他安装程序吗?我不能使用 clickonce,因为我想在 Windows Embedded 8 中将我的应用程序设置为 Shell(而不是 cmd.exe)。

4

2 回答 2

0

这是一个有趣的高可用性故事,我想不出解决它的方法,虽然 MSI 可以工作,但实际上并不是安装程序的问题。

我会创建两个安装程序:ContentManager 和 Application

CM 完成后几乎不会改变。它的工作是检查可用更新和应用程序的空闲状态。当更新可用且应用程序空闲时,它可以在后台执行新的静默并行安装应用程序。注意我说的是安装而不是升级。现在您已经安装了 2 个版本的应用程序。当旧应用程序仍然报告空闲时,它可能会被关闭并启动新版本。

这将是高度可用的,并且 MSI 不需要了解有关该场景的任何信息。它只是执行安装。

如果您不需要它那么高可用性,那么要考虑的另一件事是 Windows Installer 支持“重新启动管理器”。您的 WPF 应用程序也可以。您的应用程序可以检查更新并开始升级。然后,重新启动管理器交互将在升级期间停止并重新启动您的应用程序。

HA 解决方案的好处是您的旧版本仍然存在。内容管理器可以简单地通过运行旧版本的应用程序来取消更改。

于 2013-06-30T11:16:13.960 回答
0

@Christopher Painter,感谢您的回复。一些想法:

高可用性解决方案的基础很好,但它需要我们自己实现太多东西。对于这种情况你没有提到的一些事情:1.如果下载失败会发生什么,如果解压缩失败会发生什么,安装完成后我需要卸载以前的版本,我需要实施一些安全措施我自己的(散列“版本 xml”或类似的东西......)共享资源锁定怎么样?我也需要自己处理它...单击一次可以很好地处理所有这些东西。哦,我想避免的另一件事是维护两个应用程序,而不是您建议的一个。我不能指望“经理”这么多,我不会支持远程更新它。但是,我可以使用“推” 使用 LogMeIn 激活 MSI 的方法 - 它让我可以上传命令并将命令发送到所有机器 (AMT)。Restart Manager 解决方案对我有用。唯一我还没有弄清楚的是,我是否可以让它拖到应用程序空闲,以及持续多长时间(它必须有某种超时)。我还研究了可以在共享互斥体(“空闲”)上等待的 MSI 自定义操作。你怎么看?

于 2013-06-30T11:29:29.113 回答