无法构建我的服务:无法复制文件,因为它正由另一个进程使用

时间:2013-04-26 13:31:46

标签: c# visual-studio-2010 windows-services filelock pre-build-event

我在c#.net中构建了一个windows服务。我添加了Pre-Build和Post-Build事件,以便在构建时自动部署我的服务。但有时候我收到了这个错误:

  

无法将文件“[CompletPath ...] \ bin \ Debug \ Business.Data.dll”复制到   “斌\调试\ Business.Data.dll”。该进程无法访问该文件   'bin \ Debug \ Business.Data.dll'因为它正被另一个人使用   过程

在Pre-Build事件中,我正在关闭服务,终止使用Debug目录中的文件并卸载服务的所有任务。 .bat中的代码我在Pre-Build事件中运行:

SET executionPath=%~dp0
SET serviceName=%1
SET frameworkPath=%2
SET targetServicePath=%3
SET targetBinPath=%~4
set targetBinPath=%targetBinPath:~0,-2%

net stop %serviceName%
powershell -NonInteractive -executionpolicy Unrestricted -file "%executionPath%\unlockfiles.ps1" "%targetBinPath%"
%frameworkPath%\installutil.exe /u %targetServicePath%

Exit /b 0

在我正在安装和启动服务的构建后事件中,即使这不是问题也有代码,因为我在构建时遇到了错误,因此构建后事件没有执行。

SET serviceName=%1
SET frameworkPath=%2
SET targetServicePath=%3

%frameworkPath%\installutil.exe /ShowCallStack %targetServicePath%
net start %serviceName%

我并不总是遇到问题。我通常在第一次建造时遇到问题,我正在清理解决方案,再次构建,通常它会在此之后工作。

2 个答案:

答案 0 :(得分:1)

如果我是你,我会把这些过程分开。您无需卸载服务即可更新文件。

我不是建立前/后构建事件的忠实粉丝,而不仅仅是在构建完成后移动一些文件。

我使用xcopy / y / c" $(TargetPath)" "要复制到"

的位置

如果内存服务我甚至不必为了更新dll而停止服务,但是你可能需要在执行xcopy命令之前在post构建中停止服务。

答案 1 :(得分:0)

如果我处于你的处境,我会开始采用更多面向团队的解决方案。

我会花一些时间使用像Team City之类的东西设置一个持续集成系统(这个工具可以免费提供最多20个构建配置。我真的对JetBrains的所有内容进行评级。

然后,每当您的一个团队检查服务的新源代码时,构建系统(团队城市)将自动检测到它,并将触发一组新的构建。

您可以拥有一个针对代码运行单元测试的调试版本,一个版本构建,然后包含WiX Project,然后构建服务的安装程序。

完成这些流程后,您可以将其配置为在网络上的已知位置弹出安装程序,然后它还可以通过电子邮件通知您团队中的所有开发人员,以通知他们可以安装新版本的服务。

WiX是一种非常成熟的安装创作工具,Microsoft已将其用于许多产品。工具集有很多支持,可以使整个过程更加紧凑,可重复和可预测。

完成所有这些工作需要一些时间,但确实值得付出努力。