在WiX主要升级期间阻止服务删除/安装 - 服务不停止

时间:2014-03-01 16:39:34

标签: wix

我有一个我想象的常见场景,但是我无法完全解决问题。

这个场景很简单,我想对产品进行重大升级,而无需更改服务设置,也不需要重新启动。

  • 在正常安装时,服务应安装并启动
  • 在卸载时,服务应该停止并被删除
  • 在升级时,应停止(不删除)服务,写入新文件,然后重新启动服务

我主要使用DeleteServices上的条件NOT UPGRADINGPRODUCTCODE。但是,在升级过程中不会停止服务,因此需要重新启动。

升级是否有某种方法可以停止服务,安装新文件并重新启动服务而无需删除/安装服务?

2 个答案:

答案 0 :(得分:1)

您是否为Windows安装程序启用了等待标志以等待服务正确停止? http://msdn.microsoft.com/en-us/library/aa371634(v=vs.85).aspx。即使启用了此标志,您的服务也必须在30秒内停止或主要升级继续进行。有一些方法可以实现自己的延迟,为它提供更多时间,但如果没有必要,请不要这样做。本质上,这可能只是一个自定义操作,其中一些代码实现了属性表中自定义属性中指定的延迟。

请注意, DeleteServices 上的NOT UPGRADINGPRODUCTCODE可能看起来没有副作用,但可能发生的情况是,主要升级不会删除作为升级的一部分计划卸载的服务。换句话说,您删除了一个服务,可能添加了一个新服务,旧的服务将无法正确卸载。使用像这样的标准Windows Installer操作不是最佳做法,并且几乎肯定会有意外的副作用。在与Windows Installer作战时,您将自己画成一个角落以便以后更新。

如果我是你,我宁愿将服务安装拆分为单独的MSI,以防它处于不应受主安装影响的状态。然后将MSI文件与引导程序链接在一起。如果您将来需要添加新服务或删除旧服务,这非常灵活。它完全是vanilla,并没有与Windows Installer设计作斗争。这是从公司的角度思考,其中问题是当每个服务可能具有非常不同的发布计划时能够可靠地控制每个服务。如果您将安装程序作为第三方产品交付给某人,则可能不是您所希望的。

答案 1 :(得分:0)

这应该可以正常工作(暂时不要使用Delete),但是如果不知道你的升级版本在哪里有RemoveExistingProducts,那么目前还不清楚发生了什么,特别是如果你要添加条件并且你的StopService不起作用原因。但是DeleteServices有什么问题?如果服务没有运行,则对系统的瞬时影响很小。您是否尝试保留稍后添加的服务,例如帐户?如果你正在做的那就是一个问题,因为修复可能会失败。

无论如何,如果您的REP结束,那么适用于您的服务的简化事件序列如下:

传入安装会停止旧服务,删除服务,安装任何更新的文件,再次安装服务并启动新服务。

REP之后停止服务,不删除它,因为它被引用计数,然后启动它。 但是有一个短暂的删除,所以问题是为什么停止不起作用,问题是删除有什么不好?