Остановка и запуск службы Windows при сборке - PullRequest
0 голосов
/ 02 июля 2019

Мы хотим остановить нашу службу Windows перед тем, как перестроить ее, затем построить новую версию, затем скопировать ее в указанную папку (из-за изменений конфигурации, помещающих исполняемый файл в разные папки bin).затем перезапустите службу Windows.Звучит просто, но главная проблема, с которой мы сталкиваемся, - остановка службы, которая не сразу снимает блокировки файлов.Вызывает сбой сборки в другой раз.(один раз, чтобы остановить службу и один раз, чтобы фактически скопировать и перезапустить ее)

В настоящее время, как указано, у нас есть способ, который работает ровно в 50% случаев.Однако раздражает необходимость строить дважды каждый раз, когда мы вносим изменения в решение.Текущий способ - построить события на уровне проекта.

Предварительная сборка выглядит следующим образом:

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

Существует также проблема первоначального создания "Current"Папка как наш источник контроля не хранит папку Bin.мы могли бы добавить текущую команду mkdir, чтобы исправить это.если есть лучший способ обновить сервис при каждой сборке, мы будем благодарны за ваш совет.

1 Ответ

0 голосов
/ 02 июля 2019

У меня есть решение, которое работает.это не идеально, но, похоже, работает 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
...