2012-07-11 75 views
2

我已经在Windows应用程序的产品工作,在这里,我需要更换服务EXE(安装目录)上层次,所以我不得不停止了服务,并尝试通过给定的代码如何修改它停止后的Windows服务exe文件?

  ServiceController service = new ServiceController(servicename); 

      service.Stop(); 

      service.WaitForStatus(ServiceControllerStatus.Stopped); 

      Thread.Sleep(10000); 

      System.IO.File.Copy(application.exe, newapplication.exe, true); 
替换的exe

,其抛出的错误如下,

该进程无法访问文件'C:\ Program Files \ Myapp \ application.exe',因为它正在被另一个进程使用。

但我确定我的服务没有任何依赖关系,我找不到在停止后替换服务文件的方式,请帮我解决问题。

回答

0

我不知道它是如何工作在C#,但在C++中,你会明确首先需要能够去除二进制文件之前注销从服务控制管理器(SCM)的基础设施服务。

+0

都能跟得上。停止服务并更换exe是足够的。 – leppie 2012-07-11 11:45:32

+0

感谢您提供此信息。 .NET隐藏这些底层活动。 – mox 2012-07-11 11:51:16

+0

请留下面向scm的概念,而不是看到,在服务停止后复制粘贴服务文件的主要原因是什么? – Raja 2012-07-11 12:00:33

0

你不应该需要卸载升级它的服务。我经常通过文件副本升级服务。

尝试复制文件之前等待长达1分钟。

看看wyUpdate。 AutoUpdater进程是开源的,你可以看到他们是如何处理它的。 (无论如何我推荐产品)。

这就是说,有没有真正的魔力吧;如果您在一分钟左右仍无法复制.exe,则还有其他事情正在进行。