1

我正在尝试使用 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/@KeyPath、File/@KeyPath、RegistryValue/@KeyPath 或 ODBCDataSource/@KeyPath。

2:如何确保MSIusermodule.exe在卸载检查期间不打扰进程?

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

4

1 回答 1

2

一般回答:为了通过使用 WiX 制作的 MSI 包安装/卸载 Windows 服务,您应该只利用ServiceInstallServiceControl元素,正如 Christopher 在此线程中向您提到的那样。

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

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

希望这可以帮助。

于 2013-07-26T06:10:35.417 回答