需要一些关于使用WiX卸载我的服务的说明

时间:2013-07-25 20:45:53

标签: windows-services wix windows-installer wix3.5

我正在尝试使用WiX为我的软件编写MSI安装程序/卸载程序。该软件附带本地服务和始终一起运行的相关用户模式进程,即当服务停止时,我的服务会自动关闭用户模式进程。 (否则,如果用户模式进程自行终止,则服务将尝试重新启动它。)

因此,对于卸载,我想出了以下标记:

<Component Id="idCmp_MySrvc" 
         Guid="MY_GUID">

  <File Id="idFile_srvc.exe" 
      Name="srvc.exe" 
    Source="Sources\Code\srvc.exe" 
     Vital="yes" 
   KeyPath="yes" />

  <File Id="idFile_usermodule.exe" 
      Name="usermodule.exe" 
    Source="Sources\Code\usermodule.exe" 
     Vital="yes" 
   KeyPath="yes" />

  <ServiceControl Id="idMySrvc" 
                Name="MyServiceName" 
                Stop="uninstall" />
</Component>

这个想法是,当服务停止时,它将关闭我的usermodule.exe进程。

但是有三个问题/问题浮现在脑海中:

1:当我编译它时,它给了我以下错误:

  

错误CNDL0042:Component元素设置了多个键路径。该   密钥路径只能在支持的扩展元素中设置为“是”   它或以下位置之一:Component / @ KeyPath,   File / @ KeyPath,RegistryValue / @ KeyPath或ODBCDataSource / @ KeyPath。

2:如何确保MSI在卸载检查期间不会因usermodule.exe进程而烦恼?

3:我是否需要添加特定于我的服务和/或用户模式过程的任何内容才能使其符合卸载程序?

1 个答案:

答案 0 :(得分:2)

一般答案:为了通过使用WiX制作的MSI软件包安装/卸载Windows服务,您应该只使用ServiceInstallServiceControl元素,正如Christopher在this thread中提到的那样。

现在,回答您的具体问题:

  1. 错误消息非常具有描述性 - 您在单个组件中有多个标记为KeyPath='yes'的元素。只能有一个关键路径。您可以找到更多信息here(请参阅组件表的KeyPath列部分)。
  2. 我认为您可以安全地将usermodule.exe移动到单独的组件中。如果你说停止服务会丢弃该过程,并且我们知道卸载时的服务操作发生在文件删除之前,那么让Windows Installer完成卸载组件的工作听起来是安全的。
  3. 如前所述,我不这么认为。
  4. 希望这有帮助。