【问题标题】:Can I add a ServiceInstall component in a WiX installer that references a FileId in another component我可以在 WiX 安装程序中添加引用另一个组件中的 FileId 的 ServiceInstall 组件吗
【发布时间】:2016-06-30 10:54:54
【问题描述】:

我有一个安装程序,它使用 HEAT 从不同位置收集文件,为安装程序创建各种组件。

其中一个组件安装 Windows 服务的文件。 我想添加另一个组件来安装服务本身,但是如果我将 EXE 文件放入组件中,我会收到一个错误,即该文件将被安装两次。

有没有一种方法可以创建 ServiceInstall 组件,而不是添加 File 元素,而是从另一个组件引用文件的 ID? 我想保留安装文件但不安装服务的选项。

此外,如果我必须将文件从当前所在的组件中取出,则会增加收割脚本的各种复杂性。

组件部分现在是这样的:

<Component Id='UtilServiceInstall' Guid='{2B244D6C-BEC3-471f-A0FB-5E3B729EBE56}'>
  <File Id='UtilityService' Name='UtilityService.exe' Source='UtilityService.exe' DiskId='1' KeyPath='yes' />
  <ServiceInstall Id="UtilService" Type="ownProcess" Name="UtilService" DisplayName="Utility Service" Description="Utility Service" Start="demand" Account="LocalSystem" ErrorControl="normal">
  <util:PermissionEx  User="Everyone" ServicePauseContinue="yes" ServiceQueryStatus="yes" ServiceStart="yes" ServiceStop="yes" ServiceUserDefinedControl="yes" />                                
  </ServiceInstall>
  <ServiceControl Id="UtilService" Start="install" Stop="both" Remove="both" Name="UtilService" Wait="no" />                                
</Component>            

【问题讨论】:

  • 安装服务时遇到同样的问题,但想在 GUI 中的某个位置决定是手动启动还是自动启动。

标签: wix windows-services installation


【解决方案1】:

ServiceInstall要求安装的服务是组件的KeyPath,所以不能让服务是另一个组件中的文件。

您可以创建两个相互排斥的独立组件,一个仅包含文件,另一个包含作为服务安装的文件,然后选择需要的组件。对于两个互斥的组件,您不应该得到错误,这让我感到惊讶。

【讨论】:

  • 谢谢,我以为是这样(关于 KeyPath)。我没有尝试过让这两个组件互斥(甚至从未想过),但我会试一试。
  • 你不能通过两个不同的组件安装同一个文件,所以这个解决方案并没有真正起作用。
  • @Cavalier - 这是不正确的。如果它们具有互斥条件,则可以从两个单独的组件安装相同的文件。它总是被允许的——甚至微软过去也使用旧的 ATL 合并模块来做这件事,一个 atl.dll 以 Version9X 为条件,另一个以 VersionNT 为条件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-06
  • 1970-01-01
  • 2017-02-25
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多