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



我用c# .net构建了一个windows服务。我添加了Pre-Build和Post-Build事件来自动在构建上部署我的服务。但有时我得到这个错误:

无法复制文件"[CompletPath…]binDebugBusiness.Data.dll"到"本调试 Business.Data.dll"。进程无法访问该文件'binDebugBusiness.Data.dll',因为它正在被另一个人使用过程。

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

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

在post-build事件我正在安装和启动服务,有代码,即使这不是问题,因为我在构建上得到错误,所以post-build事件没有执行。

SET serviceName=%1
SET frameworkPath=%2
SET targetServicePath=%3
%frameworkPath%installutil.exe /ShowCallStack %targetServicePath%
net start %serviceName%

我并不总是有这个问题。我通常在第一次构建时遇到问题,我正在清理解决方案,然后再次构建,通常在此之后它就可以工作了。

如果我是你,我会把这些过程分开。你不需要卸载服务来更新文件。

除了在构建完成后移动一些文件之外,我不太喜欢pre/post构建事件。

我使用xcopy/y/c "$(TargetPath)"location to copy to"

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

如果我是你的话,我会开始采用更多以团队为导向的解决方案。

我会花一些时间使用Team City之类的工具来设置一个持续集成系统(这个工具是免费的,最多可用于20个构建配置)。我真的很喜欢JetBrains的一切。

然后每次你的一个团队为服务检入新的源代码时,它将被构建系统(team City)自动检测到,并触发一组新的构建。

你可以有一个调试版本,运行你对代码的单元测试,一个发布版本,还包括一个WiX项目,然后为服务构建一个安装程序。

一旦这些过程完成,你可以配置它弹出安装程序在你的网络上的一个已知的位置,它也可以在你的团队中的所有开发人员的电子邮件通知他们,一个新版本的服务可供安装。

WiX是一个非常成熟的安装创作工具,微软的许多产品都使用了它。有很多工具集的支持,将使您的整个过程更加紧密,可重复和可预测。

完成所有这些需要一些时间,但这真的是值得的。

相关内容

  • 没有找到相关文章

最新更新