1 <Componet Id="myservice"> 2 <File Id="Service.exe" KeyPath="yes" Source="{Service.exe路径}"> 3 <ServiceInstall Id="Installer" DisplayName="MyService" Name="MyService"/> 4 <ServiceControl Id="Control" Name="MyService" Start="install" Stop="both" Remove="uninstall"/> 5 </Componet>
但因为我这个项目包含的组件都是通过Heat.exe自动生成对应wxs文件的,而生成后的Service.wxs里面已经包含了我在上面需要引用的Service.exe。此时我再加上上面这段标签的话,会因为Service.exe被两个File标签重复引用而无法生成。
查了一圈最终找到了解决方案,让heat生成时特殊处理我的Service.exe,即修改Filter.xslt,增加如下标签
<xsl:template match="wix:Component[contains(wix:File/@Source, 'Service.exe') and not(contains(wix:File/@Source, 'Service.exe.config'))]"> <xsl:copy> <xsl:apply-templates select="node() | @*" /> <wix:ServiceInstall Id="Installer" DisplayName="MyService" Name="MyService"/> <wix:ServiceControl Id="Control" Name="MyService" Start="install" Stop="both" Remove="uninstall"/> </xsl:copy> </xsl:template>
这样一来,在Heat生成wxs的时候,会在match的文件,即Service.exe的Component内附加ServiceInstall等安装Windows服务的标签。
PS:如果组件内同时存在.exe和.exe.config的话,match条件需要像上面一样增加一个not(contains(wix:File/@Source, 'Service.exe.config'))],否则生成时会因为heat给两个文件都附加了相同的ServiceInstall标签而无法进行后续处理。如果没有.exe.config则不需要这个条件了