我有一个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}}因此也无效。
我也知道我可以为每个架构生成一个安装程序,从而避免安装程序中的任何条件,我的问题就会消失。但是,当我非常接近为所有三种架构安装一个安装程序时,我真的不喜欢有三个安装程序的想法: - )
解决此问题的其他任何技巧?
如果您还没有想到这一点,这是我继承的遗留代码库,我正在尝试为它构建一个新的安装程序来替换现有的旧版安装程序。
答案 0 :(得分:2)
这实际上似乎是WiX中的一个错误。当您执行所述操作时,它会生成有关重复主键的错误消息,但实际上,MSI SDK中的ServiceInstall表并未说明Name列是主要的。通过互斥组件的用户,您应该能够创建多个版本的服务,而不会违反任何组件规则违规行为。
WiX团队可能认为他们会更加保守并阻止人们自己开枪。他们可能会说的另一件事是,首先不要做混合安装程序,但你已经知道了。
我能想到的最好的解决方法是在安装时使用自定义操作来创建ServiceInstall表中的临时行以绕过此编译时限。