Wix主要升级:如何防止重新安装Windows服务?

时间:2010-02-09 12:09:52

标签: wix windows-installer

我正在开发一个应该安装多个Windows服务的安装程序。我们经常制作新版本(使用新的.msi文件),并且我们使用主要升级使其易于安装在以前的安装中。

问题是我们需要更新服务文件而不覆盖服务配置(例如帐户用户名和密码)。

我们在包含服务ServiceInstall文件的组件中使用ServiceControlexe。有没有办法让ServiceInstall有条件执行(使用类似REMOVE="ALL" AND NOT UPGRADINGPRODUCTCODE的条件),因此升级时不会卸载服务(刚刚停止以便我们可以升级文件)?

一种解决方案是使用自定义操作,但也许有更好的方法?

谢谢!

5 个答案:

答案 0 :(得分:11)

看来我在找错了地方。我的问题的解决方案是将NOT UPGRADINGPRODUCTCODE添加到DeleteServices标准操作。

这解决了我的问题。这种方法的警告是,当前msi文件安装的所有服务都将被删除(或不删除)。所以我无法在升级时有选择地删除/保留服务。这对我来说很好,但是我要求在升级过程中保留服务登录信息(但不是实际的服务代码)。

更新:可以从DeleteServices元素中的WiX访问InstallExecuteSequence的条件。

答案 1 :(得分:1)

这就是解决方案的外观:

<DeleteServices><![CDATA[NOT UPGRADINGPRODUCTCODE]]></DeleteServices>

在InstallExecuteSequence标记下添加。

注意:确保原始的第一个版本MSI具有此标记,否则您必须完全卸载并安装,然后此配置才会在升级时生效。

注意2:您不必使用CDATA标记,它也可以如下所示:

<DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices>

答案 2 :(得分:0)

WiX只会在版本较新的情况下更新组件。它只检查其中一个字段(汇编版本的文件版本,我记不住了),因此您可以将当前版本信息保存在一个中,并使其保持静态。这可能是一个适合你的黑客......

答案 3 :(得分:0)

我为同一个exe创建了2个组件,每个组件都有一个条件。一个用于WIX_UPGRADE_DETECTED,另一个用于NOT WIX_UPGRADE_DETECTED。在WIX_UPGRADE_DETECTED中,我不包含serviceinstall元素,而NOT WIX_UPGRADE_DETECTED包含serviceinstall元素。

答案 4 :(得分:0)

使用服务标准操作的条件不会扩展到一个服务。

解决此问题的方法是在InstallFinalize之前安排RemoveExistingProducts。然后确保您的新版本具有与其替换版本相同的版本的服务EXE。这样Windows Installer就无法卸载/重新安装该组件。

最后将您的配置数据放入另一个将安装的组件中并对您的服务进行编码,以注意数据配置已更改并在需要时重新加载。

就我个人而言,我不这样做。我停下来,重新安装,一直启动服务,没有可怕的后果,然后安装需要几秒钟。