Event Build pre & post для остановки и перезапуска службы Windows - PullRequest
16 голосов
/ 14 марта 2011

Я экспериментировал с использованием событий сборки для запуска и остановки службы Windows, которая встраивается в мой проект.Однако для предварительной и последующей сборок произошел сбой с уровнем ошибки 255. Я попытался отловить это с предварительной сборкой, но не повезло.

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
)

Ответы [ 4 ]

22 голосов
/ 04 июля 2011

В следующем блоге Джоэла Варти есть решение, которое я использую: Использование событий сборки для перестройки службы Windows без необходимости останавливать / запускать ее вручную

Единственная проблема - когда вы делаете перестройку. Visual Studio очищает файлы до того, как сработает событие перед сборкой. Это, конечно, сбой, потому что служба все еще работает. Но регулярные сборки работают отлично. Надеюсь это поможет.

1 голос
/ 02 января 2014

Условное выражение не требует двойного qoute ("")

Это должно быть похоже на

if $(ConfigurationName) == Debug (
 net stop myService
 ...
)
1 голос
/ 28 марта 2011

Попробуйте использовать открывающую скобку в первой строке кода предварительной сборки

0 голосов
/ 01 сентября 2017

Вот как я заставил его работать:

(это решение было частью корпоративного программного обеспечения, где некоторые DLL-файлы повторно используются другим приложением)

Модель - это проект, на который есть ссылка в сервисном проекте, и он создается перед сервисным. Вот почему мы пишем эти коды в событиях перед сборкой модели:


Событие предварительной сборки модели:

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
  • создает каталог в выходной папке
  • находит сервис по имени
  • останавливает это
  • удаляет его
  • выход 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"
  • скопировать все необходимое для службы в другую папку
  • устанавливает сервис
  • запускает службу

О разрешениях?

  • visual studio автоматически запросит повышенное разрешение
...