我在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%
我并不总是遇到问题。我通常在第一次建造时遇到问题,我正在清理解决方案,再次构建,通常它会在此之后工作。
答案 0 :(得分:1)
我不是建立前/后构建事件的忠实粉丝,而不仅仅是在构建完成后移动一些文件。
我使用xcopy / y / c" $(TargetPath)" "要复制到"
的位置如果内存服务我甚至不必为了更新dll而停止服务,但是你可能需要在执行xcopy命令之前在post构建中停止服务。
答案 1 :(得分:0)
如果我处于你的处境,我会开始采用更多面向团队的解决方案。
我会花一些时间使用像Team City之类的东西设置一个持续集成系统(这个工具可以免费提供最多20个构建配置。我真的对JetBrains的所有内容进行评级。
然后,每当您的一个团队检查服务的新源代码时,构建系统(团队城市)将自动检测到它,并将触发一组新的构建。
您可以拥有一个针对代码运行单元测试的调试版本,一个版本构建,然后包含WiX Project,然后构建服务的安装程序。
完成这些流程后,您可以将其配置为在网络上的已知位置弹出安装程序,然后它还可以通过电子邮件通知您团队中的所有开发人员,以通知他们可以安装新版本的服务。
WiX是一种非常成熟的安装创作工具,Microsoft已将其用于许多产品。工具集有很多支持,可以使整个过程更加紧凑,可重复和可预测。
完成所有这些工作需要一些时间,但确实值得付出努力。