簡體   English   中英

在構建中停止並啟動Windows服務

[英]Stop And Start Windows Service On Build

我們希望在重建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命令來解決此問題。 如果有更好的方法來更新服務,您的建議將不勝感激。

我有一個可行的解決方案。 它不是理想的,但似乎確實有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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM