我想知道,如果在WiX项目文件中将服务标记为Remove="uninstall" Stop="uninstall"
,如何以及何时尝试停止服务。
我为什么要问: 在卸载时,RESTART MANAGER无法正确识别或处理该服务,从而导致“重新启动对话框”。
我将调试器连接到服务并意识到,它从未被尝试停止 - 至少,不是通过注册的ControlHandler。我猜测它将以执行“sc stop servicename”或通过Services-Dialog停止它的方式停止。服务本身是用C ++编写的,控制处理程序由RegisterServiceCtrlHandler
注册,它在两个概述的情况下都能正常工作。停止服务时调用处理程序。不是这样,如果通过MSI停止/卸载它。
顺便说一句,正如Wix Installer Problem: Why does RestartManager mark Service as RMCritical and not RMService中jbudreau的答案所述,如果服务作为LocalSystem运行,那么在InstallValidate部分中是否可以停止服务?在InstallValidate中,卸载过程尚未提升。
关于停止LocalSystem服务的过程如何处理卸载的一些解释会很棒!
提前致谢!
修改 这是ServiceInstall和ServiceControl的服务定义:
<DirectoryRef Id="BINDIR">
<!-- the service -->
<Component Id="myProgramsvc.exe" Guid="1f64c03f-26ea-47ba-985c-2a566afffffa">
<File Id="myProgramsvc.exe" KeyPath="yes" Vital="yes"
Source="SourceDir\bin\myProgramsvc.exe"/>
<ServiceInstall Id="MyProgramSvc" Type="ownProcess"
Vital="yes" Name="MyProgramSvc" DisplayName="Test MyProgram Service"
Description="Test MyProgram Service" Start="auto" Account=".\LocalSystem"
ErrorControl="normal" Interactive="no" Arguments="--run"/>
<ServiceControl Id="MyProgramSvc" Name="MyProgramSvc" Wait="yes" Remove="uninstall" Stop="uninstall" Start="install"/>
</Component>
</DirectoryRef>
和进程层次结构,其中RestartManager抱怨---- as.exe(PID:4312): 编辑2:(id 9324与截图不同,取自不同的日志文件尝试)
MSI (s) (BC:38) [16:46:14:141]: RESTART MANAGER: Detected that application with id 9324, friendly name '---as.exe', of type RmCritical and status 1 holds file[s] in use.
MSI (s) (BC:38) [16:46:14:141]: RESTART MANAGER: Did detect that a critical application holds file[s] in use, so a reboot will be necessary.
编辑3: 日志文件:uninstall.log - 日志文件太大,无法在此处发布(30000个字符限制)。
答案 0 :(得分:1)
InstallValidate不会停止服务 - 这是由StopServices操作完成的。 InstallValidate试图找出正在使用的文件(使用Restart Manager)并显示正在使用的文件对话框。在涉及服务的情况下,它会忽略ServiceControl表中具有“停止卸载”设置的服务所使用的任何文件。如果要确保服务完全停止,请使用wait =“yes”。这是一个标准的停止服务控制处理程序调用。
如果该服务触发了一堆仍在运行的进程,则它只是一个普通的使用中文件问题,而且服务不相关。这些进程需要关闭调用(来自服务?)或者他们应该与Restart Manager集成,这类事情:http://www.codeproject.com/Articles/772868/Restart-Manager-Support-For-Windows-Application
如果进程响应Windows消息,则WiX util CloseApplication应将其关闭。
我会指出您的WiX中可能只有一个错误,其中ServiceControl中指定的服务不正确。由于您可以控制任何服务(不只是您正在安装/卸载的服务),因此不会检查该名称是否与您的服务或任何其他服务相对应。如果你从未看到服务控制停止被调用,这是最简单的解释。