Событие Создайте pre & post, чтобы остановить и перезапустить службу Windows
Я экспериментировал с использованием событий сборки, чтобы запустить и остановить службу Windows, которая строится в моем проекте. Однако для пре-и пост-сборок сбой с уровнем ошибки 255. Я пытался поймать это с предварительной сборкой без везения.
Предварительно сборки
if "$(ConfigurationName)" == "Debug"
(
net stop myService
if errorlevel 2
if errorlevel 255
:exit
:exit
)
После сборки
if "$(ConfigurationName)" == "Release"
(
copy $(TargetDir) C:\Media\Bin\$(ProjectName)
if errorlevel 1 BuildEventFailed
:BuildEventFailed
mkdir C:\Media\Bin\$(ProjectName)
copy $(TargetDir) C:\Media\Bin\$(ProjectName)
)
else if "$(ConfigurationName)" == "Debug"
(
net start myService
)
Ответы
Ответ 1
В следующем блоге Joel Varty есть решение, которое я использую:
Использовать события сборки для восстановления службы Windows без ручного остановки/запуска
Единственная проблема заключается в том, когда вы выполняете пересоединение. Visual Studio очищает файлы до возникновения события предварительной сборки. Это значит, что это не так, потому что служба все еще работает. Но регулярные сборки отлично работают. Надеюсь это поможет.
Ответ 2
Попробуйте использовать раскрывающееся parenthese в первой строке вашего кода предварительной сборки
Ответ 3
Условный оператор не требует double-qoute ("")
Это должно быть как
if $(ConfigurationName) == Debug (
net stop myService
...
)
Ответ 4
Вот как я заработал:
(это решение было частью корпоративного программного обеспечения, где некоторые DLL файлы повторно использовались другим приложением)
Модель - это проект, на который ссылается проект службы, и он создается до службы. Вот почему мы пишем эти коды в Pre-Build Events:
Предполагаемое событие модели:
if not exist "$(SolutionDir)UI\bin\Debug\ServiceFolder" mkdir "$(SolutionDir)UI\bin\Debug\ServiceFolder"
net start | find "[Service Name]"
if ERRORLEVEL 0 (
net stop "Service Name"
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe" -u "$(SolutionDir)UI\bin\Debug\ServiceFolder\Service.exe"
)
exit 0
- создает каталог в выходной папке
- находит службу по имени
- останавливает его
- удаляет его
- exit 0 заставляет процесс сборки продолжать, если здесь происходит ошибка.
Служба после сборки:
xcopy /E /Y "$(ProjectDir)bin\Debug\*" "$(SolutionDir)UI\bin\Debug\ServiceFolder"
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe" "$(SolutionDir)UI\bin\Debug\ServiceFolder\Service.exe"
net start "Service Name"
- скопировать все необходимое для службы в другую папку
- устанавливает сервис
- запускает сервис
О разрешениях?
- визуальная студия будет запрашивать повышенное разрешение автоматически