我正在尝试使用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:我是否需要添加特定于我的服务和/或用户模式过程的任何内容才能使其符合卸载程序?
答案 0 :(得分:2)
一般答案:为了通过使用WiX制作的MSI软件包安装/卸载Windows服务,您应该只使用ServiceInstall和ServiceControl元素,正如Christopher在this thread中提到的那样。
现在,回答您的具体问题:
KeyPath='yes'
的元素。只能有一个关键路径。您可以找到更多信息here(请参阅组件表的KeyPath
列部分)。usermodule.exe
移动到单独的组件中。如果你说停止服务会丢弃该过程,并且我们知道卸载时的服务操作发生在文件删除之前,那么让Windows Installer完成卸载组件的工作听起来是安全的。希望这有帮助。