我用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是一个非常成熟的安装创作工具,微软的许多产品都使用了它。有很多工具集的支持,将使您的整个过程更加紧密,可重复和可预测。
完成所有这些需要一些时间,但这真的是值得的。