Событие Build 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
)

person wonea    schedule 14.03.2011    source источник


Ответы (4)


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

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

person SDM    schedule 04.07.2011
comment
Я предпочитаю иметь stop, copy, start, exit все после сборки, поскольку путь службы, вероятно, не должен указывать непосредственно на папку /bin/Release. Это также предотвращает остановку службы, но никогда не перезапускает ее, если сборка завершается сбоем по другим причинам. - person Dan Bechard; 13.02.2013
comment
@Dan имеет правильный ответ. Это также позволяет вам легко переключаться на другие конфигурации сборки, ветки и т. д. без переустановки/переназначения службы. Из комментария к ссылке SDM вы также можете автоматически установить службу, чтобы для новых разработчиков она просто работала. - person Nelson Rothermel; 07.04.2014

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

person Luuk Krijnen    schedule 28.03.2011

Условный оператор не требует двойной кавычки ("")

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

if $(ConfigurationName) == Debug (
 net stop myService
 ...
)
person Andy    schedule 02.01.2014
comment
Я считаю, что это обычная практика всегда использовать кавычки, если переменная пуста, иначе вы можете получить if == Debug вместо if "" == "Debug". Однако в этом случае $(ConfigurationName) должно всегда иметь значение. - person Nelson Rothermel; 07.04.2014
comment
Не уверен. Когда я добавил, это не сработало для меня в Visual Studio - person Andy; 08.04.2014
comment
Возможно, ты прав. Я много раз видел эту практику в пакетных файлах и предполагал, что это так. Беглым поиском в интернете ничего толкового не нашел. - person Nelson Rothermel; 12.04.2014

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

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

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

  • Visual Studio автоматически запросит повышенное разрешение
person Bizhan    schedule 01.09.2017