18 Stimmen

Event Build vor und nach dem Anhalten und Neustart des Windows-Dienstes

Ich habe mit der Verwendung von Build-Ereignissen zum Starten und Stoppen von Windows-Diensten, die in meinem Projekt erstellt werden, experimentiert. Jedoch für die Pre & Post-Builds scheitern mit einer Fehlerstufe 255. Ich habe versucht, fangen diese mit der Pre-Build mit kein Glück.

Vor dem Bau

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

   :exit
)

Nach dem Bau

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
)

23voto

SDM Punkte 564

Der folgende Weblog von Joel Varty bietet eine Lösung, die ich verwende: Verwenden Sie Build-Ereignisse, um einen Windows-Dienst neu zu erstellen, ohne ihn manuell stoppen/starten zu müssen.

Das einzige Problem ist, wenn man einen Umbau vornimmt. Visual Studio bereinigt die Dateien, bevor das Pre-Build-Ereignis ausgelöst wird. Dies schlägt dann natürlich fehl, weil der Dienst noch läuft. Aber reguläre Builds funktionieren hervorragend. Hoffentlich hilft das.

1voto

Luuk Krijnen Punkte 1170

Versuchen Sie, die öffnende Klammer in der ersten Zeile Ihres Pre-Build-Codes zu verwenden

1voto

Andrew Chaa Punkte 5562

Die bedingte Anweisung erfordert keine doppelte Anführungszeichen ("")

Es sollte so sein

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

0voto

Bizhan Punkte 14915

So habe ich es zum Laufen gebracht:

(diese Lösung war Teil einer Unternehmenssoftware, bei der einige dll-Dateien von einer anderen Anwendung wiederverwendet werden)

Model ist ein Projekt, auf das im Service-Projekt verwiesen wird, und es wird vor dem Service erstellt. Deshalb schreiben wir diese Codes in die Pre-Build Events von Model:


Model Pre-Build Event:

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
  • erstellt ein Verzeichnis im Ausgabeordner
  • findet den Dienst anhand seines Namens
  • stoppt es
  • deinstalliert es
  • exit 0 bewirkt, dass der Erstellungsprozess fortgesetzt wird, wenn hier ein Fehler auftritt

Dienstleistung Post-Build Event:

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"
  • alles, was für den Dienst benötigt wird, in einen anderen Ordner kopieren
  • Installiert Dienst
  • startet den Dienst

Über Genehmigungen?

  • Visual Studio fragt automatisch nach erweiterten Rechten

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X