在多平台WiX安装程序中安装依赖于体系结构的服务
我有一个windows服务exe,编译为x86、amd64和安腾。我正在尝试构建一个用于安装此服务的x86 WiX/MSI安装程序。安装程序有三个具有特定于体系结构条件的组件(例如,在多平台WiX安装程序中安装依赖于体系结构的服务,wix,Wix,我有一个windows服务exe,编译为x86、amd64和安腾。我正在尝试构建一个用于安装此服务的x86 WiX/MSI安装程序。安装程序有三个具有特定于体系结构条件的组件(例如,非版本nt64用于检测x86),因此任何给定体系结构上都只安装过一个组件。这些组件安装exe的x86、x64或安腾版本 这一切都很好,三个平台上都安装了正确的二进制文件 下一步是使用ServiceInstall标记为我的exe设置Windows服务,这就是我们遇到问题的地方:显然ServiceInstall标记的Na
非版本nt64
用于检测x86),因此任何给定体系结构上都只安装过一个组件。这些组件安装exe的x86、x64或安腾版本
这一切都很好,三个平台上都安装了正确的二进制文件
下一步是使用ServiceInstall
标记为我的exe设置Windows服务,这就是我们遇到问题的地方:显然ServiceInstall
标记的Name
属性在WiX文件中必须是唯一的。我想在所有三种平台上调用该服务,例如FooBar
,但这是不允许的-由于名称冲突,WiX文件无法编译
作为一种解决方法,我可以使用依赖于体系结构的服务名称,例如FooBar_ia64
,但这对我来说似乎很难看,加上代码库中有许多地方对服务名称进行了假设,因此如果我更改服务名称,我必须在代码库中查找并修改所有这些地方
我尝试将ServiceInstall
移动到它自己的组件中,该组件将安装在所有三种体系结构上,但是ServiceInstall
标记显然隐式引用了在同一组件中定义的文件
标记,因此也不起作用
我还意识到,我可以为每个体系结构生成一个安装程序,从而避免安装程序中的任何条件,我的问题就会迎刃而解。但我真的很不喜欢在三种体系结构都几乎只有一个安装程序的情况下有三个安装程序的想法:-)
还有什么其他的技巧可以绕过这个问题吗
以防万一你还没有弄明白,这是我继承的一个遗留代码库,我正在尝试为它构建一个新的安装程序来替换现有的遗留安装程序。这实际上看起来像是WiX中的一个bug。当您执行您所说的操作时,它会生成一条关于重复主键的错误消息,但实际上MSI SDK中的ServiceInstall表并没有说明名称列是主键。通过互斥组件的用户,您应该能够编写服务的多个版本,并且不会违反任何组件规则
WiX团队可能认为他们会更加保守,防止人们开枪自杀。他们可能会说的另一件事是,首先不要做混合安装,但你已经知道了
我认为最好的解决方法是在安装时使用自定义操作在ServiceInstall表中创建一个临时行,以绕过编译时限制