请查看以下代码,了解我的项目安装程序BeforeInstall事件。正在调用该事件,因为安装成功完成并将卸载我的服务,然后再安装新服务,但仅限于在运行新版本的安装程序之前停止正在运行的服务。
由于某种原因,事件中的代码要么没有停止服务,要么就是没有等待服务停止,这两个我都告诉它在继续卸载服务之前要做的 - 这又是如果服务未运行,将成功完成。它似乎甚至没有停止服务,因为在我收到资源正在使用的错误后,我查看服务并看到该服务确实仍在运行。作为参考,我还包括成功启动我的服务的AfterInstall事件。
[编辑] 在我的事件触发之前,似乎检查是否正在使用资源。实际上,我已经尝试过安装程序和服务安装程序的多个事件无济于事。比如OnBeforeUninstall ...等...我尝试了多种关闭进程的方法,包括打开cmd.exe并在我的服务上运行sc stop。在检查资源是否正在使用之前,它甚至不会尝试运行cmd.exe。在资源检查发生之前,是否有更好的地方运行服务停止代码?我甚至在项目安装程序类的Initialize组件之前抛出它。有谁知道资源检查何时发生?
void ProjectInstaller_BeforeInstall(object sender, InstallEventArgs e)
{
List<ServiceController> services = new List<ServiceController>(ServiceController.GetServices());
foreach (ServiceController s in services)
{
if (s.ServiceName == this.serviceInstaller1.ServiceName)
{
if(s.Status == ServiceControllerStatus.Running)
{
s.Stop();
s.WaitForStatus(ServiceControllerStatus.Stopped);
}
ServiceInstaller ServiceInstallerObj = new ServiceInstaller();
ServiceInstallerObj.Context = new InstallContext();
ServiceInstallerObj.Context = Context;
ServiceInstallerObj.ServiceName = s.ServiceName;
ServiceInstallerObj.Uninstall(null);
break;
}
}
}
private void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)
{
using (ServiceController s = new ServiceController(serviceInstaller1.ServiceName))
{
s.Start();
}
}