我正在开发一个将文件复制到 Program Files 然后运行服务的安装程序(通过复制的文件之一)。在第一次安装时,这将没有问题,但是当安装程序运行并且服务已经在机器上运行时,问题开始出现。这是因为安装程序正在尝试替换 Program Files 中已存在的文件,但其中一个文件正在被 Windows 服务使用,因此除非停止服务,否则无法替换它。
所以我决定在安装开始时使用 ServiceController API 停止服务,安装文件(覆盖现有文件),然后重新开始服务。代码很少,但这里是:
实例化服务控制器:
try
{
service = new ServiceController(serviceName);
}
catch (InvalidOperationException ioe)
{
// ...
}
停止服务:
if (service.Status != ServiceControllerStatus.Stopped)
{
service.Stop();
}
然后等待服务停止并安装文件:
service.WaitForStatus(ServiceControllerStatus.Stopped);
// install files...
最后重启服务:
service.Start();
使用此代码,该service.WaitForStatus()
方法将永远等待(或者比我准备等待的时间更长,至少等待一个小时)。奇怪的是,我可以运行这段代码,写入service.Status()
日志,手动检查服务是否已停止,查看日志发现 ServiceController 认为服务仍在运行。
起初我认为问题出在service.Stop()
所以我尝试创建几个Process
获取服务 PID 的对象,然后终止任务,这会立即停止服务,但仍然ServiceController
无法识别服务已停止。如果我service.WaitForStatus()
从代码中删除该方法,则会引发异常,因为安装程序正在尝试覆盖服务正在使用的文件。
另外,我已经尝试过使用不同的服务,但结果总是一样的,这让我相信问题不在于服务本身。
为什么ServiceController
无法识别服务已停止?这个问题有解决方案或解决方法吗?我正在使用.NET 2.0,所以不幸的是,任何需要更高的东西都不是我的选择。干杯。