2011-03-14 12 views
15

He estado experimentando con el uso de eventos de compilación para iniciar y detener el servicio de Windows que se están construyendo en mi proyecto. Sin embargo, para el pre &, las compilaciones posteriores fallan con un nivel de error 255. Intenté detectar esto con la compilación previa sin suerte.Event Build pre y post para detener y reiniciar el servicio de Windows

Pre-Construcción

if "$(ConfigurationName)" == "Debug" 
(
net stop myService 
if errorlevel 2 
    if errorlevel 255 
     :exit 

    :exit 
) 

posterior a la generación

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 
) 

Respuesta

1

intenta usar los paréntesis que la apertura de la primera línea de su código de pre-construcción

21

La siguiente weblog por Joel Varty tiene una solución que utilizo: Use Build Events to rebuild a Windows Service without having to manually stop/start it

El único problema es cuando haces una reconstrucción. Visual Studio limpia los archivos antes de que se active el evento de preconstrucción. Este curso no funciona porque el servicio todavía se está ejecutando. Pero las construcciones regulares funcionan bien. Espero que esto ayude.

+3

Yo prefiero tener 'detener, copiar, iniciar, exit' todo en post-construcción ya que la ruta de servicio probablemente no debe apuntar directamente a un/bin/carpeta de liberación. Esto también evita que el servicio se detenga, pero nunca se reinicia si la compilación falla por otros motivos. – Dan

+2

@Dan tiene la respuesta correcta. Esto también le permite cambiar fácilmente a diferentes configuraciones de compilación, ramas, etc. sin reinstalar/redefinir el servicio. Desde un comentario en el enlace de SDM, también puede instalar automáticamente el servicio para que los nuevos desarrolladores funcionen. –

1

La sentencia condicional no requiere de doble qoute ("")

Debe ser como

if $(ConfigurationName) == Debug (
net stop myService 
... 
) 
+0

Creo que es una práctica común usar siempre comillas en caso de que la variable esté vacía, de lo contrario puede terminar con 'if == Debug' en lugar de' if "" == "Debug" '. Sin embargo, en este caso '$ (ConfigurationName)' * debe * siempre tener un valor. –

+0

No estoy seguro. Cuando agregué "", no funcionó para mí en el estudio visual – Andy

+0

. Puede que tengas razón. He visto la práctica muchas veces en archivos por lotes y asumí que ese era el caso. Con una búsqueda rápida en línea, realmente no encontré nada definitivo. –

0

Esto es cómo llegué a trabajar:

(esta solución era una parte de un software empresarial donde algunos archivos dll son reutilizados por otra aplicación)

El modelo es un proyecto que es ref Erenced en el proyecto de Servicio y está construido antes del Servicio. Es por eso que escribimos estos códigos en pre-eventos de generación de Modelo:


modelo de pre-Build Evento:

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 
  • crea un directorio en la carpeta de salida
  • encuentra el servicio por su nombre
  • lo para
  • lo desinstala
  • exit 0 hace que el proceso de construcción para continuar si se produce un error aquí

servicio posterior a la generación de eventos:

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" 
  • copiar todo lo necesario para el servicio a una carpeta diferente
  • instalaciones servicio
  • inicia el servicio

Acerca de los permisos?

  • Visual Studio pedirá permiso elevada automáticamente
Cuestiones relacionadas