无法更新我自己的 windows 服务,因为它正被另一个进程使用
Cannot update my own windows service because it is being used by another process
我创建了一个应用程序来更新 Windows 服务应用程序(我也创建了)。这个“更新程序”应用程序就像一个魅力,但前提是 Windows 服务已经停止。
更新应用程序的操作顺序如下:
- 获取
ServiceController
对象
- 调用
myService.Stop()
(如果它还没有处于ServiceControllerStatus.Stopped
状态)
- 致电
myService.WaitForStatus()
- 致电
myService.Close()
- 更新所有 .dll 文件
- 致电
myService.Start()
- 致电
myService.Close()
如果服务已经停止,那么这确实有效。但是,如果该服务之前是 运行ning,则更新应用程序将停止该服务并继续执行步骤 #5。此时,我会收到一条错误消息,说我无法覆盖 .dll 文件,因为这些文件正被另一个进程使用。
起初我以为是我自己的更新程序应用程序通过 ServiceController
对象保持对服务的引用,那时我添加了第 4 步,这并没有改变任何东西。
如果我 运行 更新程序应用程序两次,第一次它停止它并在更新 .dll 文件时失败。然后它第二次注意到它已经停止并尝试更新 .dll 文件,然后一切正常。更新服务 .dll 并启动服务。
private static bool ServiceCommand(string serviceName, bool startService, TimeSpan timeout)
{
if (!GetServiceObject(serviceName, out ServiceController service)) return false;
try
{
// First, check to make sure it's not already started or stopped
if (service.Status == (startService ? ServiceControllerStatus.Running : ServiceControllerStatus.Stopped))
{
return true;
}
ServiceControllerStatus myTargetStatus;
if (startService)
{
service.Start();
myTargetStatus = ServiceControllerStatus.Running;
}
else
{
service.Stop();
myTargetStatus = ServiceControllerStatus.Stopped;
}
// Wait for the target status
service.WaitForStatus(myTargetStatus, timeout);
}
catch (Exception e)
{
Logger.Log("Unable to " + (startService ? "start" : "stop") + " service '" + service.ServiceName + "': " + e.Message);
return false;
}
finally
{
if (service != null) service.Close();
}
return true;
}
我相信这就是问题所在。在第 5 步中,我所做的只是 File.Copy()
并将覆盖参数设置为 true。这是我收到错误消息 The process cannot access the file '' because it is being used by another process.
的地方
非常感谢任何帮助或意见!谢谢!
可执行文件可以向服务控制管理器报告 服务 已停止,但可执行文件可以继续 运行 一段时间,例如清理东西或者让后台线程完成他们的工作。它不应该那样做,在那种情况下它应该请求更多的关闭时间,但这可能就是正在发生的事情。
因此,要么修复您的服务,使其可执行文件在报告服务停止状态后立即停止,要么等待您的可执行文件停止,然后再复制文件。
另见 Service not fully stopped after ServiceController.Stop(), what is the maximum time windows service wait to process stop request and how to request for additional time。
我创建了一个应用程序来更新 Windows 服务应用程序(我也创建了)。这个“更新程序”应用程序就像一个魅力,但前提是 Windows 服务已经停止。
更新应用程序的操作顺序如下:
- 获取
ServiceController
对象 - 调用
myService.Stop()
(如果它还没有处于ServiceControllerStatus.Stopped
状态) - 致电
myService.WaitForStatus()
- 致电
myService.Close()
- 更新所有 .dll 文件
- 致电
myService.Start()
- 致电
myService.Close()
如果服务已经停止,那么这确实有效。但是,如果该服务之前是 运行ning,则更新应用程序将停止该服务并继续执行步骤 #5。此时,我会收到一条错误消息,说我无法覆盖 .dll 文件,因为这些文件正被另一个进程使用。
起初我以为是我自己的更新程序应用程序通过 ServiceController
对象保持对服务的引用,那时我添加了第 4 步,这并没有改变任何东西。
如果我 运行 更新程序应用程序两次,第一次它停止它并在更新 .dll 文件时失败。然后它第二次注意到它已经停止并尝试更新 .dll 文件,然后一切正常。更新服务 .dll 并启动服务。
private static bool ServiceCommand(string serviceName, bool startService, TimeSpan timeout)
{
if (!GetServiceObject(serviceName, out ServiceController service)) return false;
try
{
// First, check to make sure it's not already started or stopped
if (service.Status == (startService ? ServiceControllerStatus.Running : ServiceControllerStatus.Stopped))
{
return true;
}
ServiceControllerStatus myTargetStatus;
if (startService)
{
service.Start();
myTargetStatus = ServiceControllerStatus.Running;
}
else
{
service.Stop();
myTargetStatus = ServiceControllerStatus.Stopped;
}
// Wait for the target status
service.WaitForStatus(myTargetStatus, timeout);
}
catch (Exception e)
{
Logger.Log("Unable to " + (startService ? "start" : "stop") + " service '" + service.ServiceName + "': " + e.Message);
return false;
}
finally
{
if (service != null) service.Close();
}
return true;
}
我相信这就是问题所在。在第 5 步中,我所做的只是 File.Copy()
并将覆盖参数设置为 true。这是我收到错误消息 The process cannot access the file '' because it is being used by another process.
非常感谢任何帮助或意见!谢谢!
可执行文件可以向服务控制管理器报告 服务 已停止,但可执行文件可以继续 运行 一段时间,例如清理东西或者让后台线程完成他们的工作。它不应该那样做,在那种情况下它应该请求更多的关闭时间,但这可能就是正在发生的事情。
因此,要么修复您的服务,使其可执行文件在报告服务停止状态后立即停止,要么等待您的可执行文件停止,然后再复制文件。
另见 Service not fully stopped after ServiceController.Stop(), what is the maximum time windows service wait to process stop request and how to request for additional time。