无法更新我自己的 windows 服务,因为它正被另一个进程使用

Cannot update my own windows service because it is being used by another process

我创建了一个应用程序来更新 Windows 服务应用程序(我也创建了)。这个“更新程序”应用程序就像一个魅力,但前提是 Windows 服务已经停止。

更新应用程序的操作顺序如下:

  1. 获取ServiceController对象
  2. 调用myService.Stop()(如果它还没有处于ServiceControllerStatus.Stopped状态)
  3. 致电myService.WaitForStatus()
  4. 致电myService.Close()
  5. 更新所有 .dll 文件
  6. 致电myService.Start()
  7. 致电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