在多平台WiX安装程序中安装体系结构相关服务

时间:2011-03-18 18:00:31

标签: wix

我有一个Windows服务exe,编译为x86,amd64和Itanium。我正在尝试构建一个用于安装此服务的x86 WiX / MSI安装程序。安装程序有三个具有体系结构特定条件的组件(例如<Condition>NOT VersionNT64</Condition>用于检测x86),因此在任何给定的体系结构中只安装了其中一个组件。这些组件安装exe的x86,x64或Itanium版本。

一切正常,三个平台上都安装了正确的二进制文件。

下一步是使用ServiceInstall标记为我的exe设置Windows服务,这就是我们遇到麻烦的地方:显然Name标记的ServiceInstall属性必须在WiX文件中是唯一的。我想打电话给服务,例如在所有三个平台上FooBar,但这是不允许的 - 由于名称冲突,WiX文件无法编译。

作为一种解决方法,我可以使用与体系结构相关的服务名称,例如FooBar_ia64,但这对我来说似乎很难看,加上代码库有很多地方可以对服务名称做出假设,所以如果我更改服务名称,我将不得不在中找到并修改所有这些地方。代码库。

我尝试将ServiceInstall移动到将在所有三种体系结构上安装的Component,但ServiceInstall标记显然隐式引用了File标记中定义的Component标记。相同的{{1}}因此也无效。

我也知道我可以为每个架构生成一个安装程序,从而避免安装程序中的任何条件,我的问题就会消失。但是,当我非常接近为所有三种架构安装一个安装程序时,我真的不喜欢有三个安装程序的想法: - )

解决此问题的其他任何技巧?

如果您还没有想到这一点,这是我继承的遗留代码库,我正在尝试为它构建一个新的安装程序来替换现有的旧版安装程序。

1 个答案:

答案 0 :(得分:2)

这实际上似乎是WiX中的一个错误。当您执行所述操作时,它会生成有关重复主键的错误消息,但实际上,MSI SDK中的ServiceInstall表并未说明Name列是主要的。通过互斥组件的用户,您应该能够创建多个版本的服务,而不会违反任何组件规则违规行为。

WiX团队可能认为他们会更加保守并阻止人们自己开枪。他们可能会说的另一件事是,首先不要做混合安装程序,但你已经知道了。

我能想到的最好的解决方法是在安装时使用自定义操作来创建ServiceInstall表中的临时行以绕过此编译时限。