我们要在重新构建Windows Service之前先停止其Windows Service,然后构建新版本,然后将其复制到指定的文件夹(由于配置更改,将exe置于不同的bin文件夹中)。然后重新启动Windows服务。听起来很简单,但是我们遇到的主要问题是停止服务不会立即释放文件锁。导致构建失败。 (一次停止该服务,一次真正复制并重新启动它)
目前,如上所述,我们确实有50%的时间可以正常工作的方式。但是,每次我们更改解决方案时都必须构建两次,这很烦人。当前的方法是在项目级别上构建事件。
Prebuild看起来像这样:
cd C:\Windows\Microsoft.NET\Framework\v4.0.30319
net start | find "ServiceHost"
if Not ERRORLEVEL 1 InstallUtil.exe -u
$(ProjectDir)bin\Current\ServiceHost.exe
Exit /b 0
和PostBuild看起来像这样:
cd $(ProjectDir)bin
DEL Current\* /F /Q /S
xcopy $(Configuration) Current
cd C:\Windows\Microsoft.NET\Framework\v4.0.30319
InstallUtil.exe $(ProjectDir)bin\Current\ServiceHost.exe
net start ServiceHost
Exit /b 0
还有一个初始创建“当前”文件夹的问题,因为我们的源代码控制没有保留Bin文件夹。我们可以在其中添加mkdir current命令来解决此问题。如果有更好的方法来更新服务,则您的建议将不胜感激。
答案 0 :(得分:0)
我有一个可行的解决方案。它不理想,但似乎确实可以100%地起作用
预构建:
net stop ServiceHost
:delete
cd $(ProjectDir)
rmdir /s /q $(ProjectDir)bin\Current
echo delete Error Level %ERRORLEVEL%
goto checkDelete
:checkDelete
cd $(ProjectDir)bin\Current
echo check Error Level %ERRORLEVEL%
if %ERRORLEVEL% == 1 (GOTO end) else (GOTO retry)
:retry
echo Prebuild Retry after 5 seconds
powershell -command "Start-Sleep -s 5"
GOTO delete
:end
echo Prebuild Terminate
Exit /b 0
发布后的版本:
cd $(ProjectDir)bin
:copy
mkdir Current
xcopy $(Configuration) Current
echo PostBuild Error Level %ERRORLEVEL%
if not %ERRORLEVEL% == 0 (GOTO copy)
echo starting service
net start ServiceHost
Exit /b 0