2013-05-17 14 views
7

Wenn ich einen Windows-Dienst schreibe und einfach F5 drücke, erhalte ich die Fehlermeldung, dass ich ihn unter installutil.exe installieren und dann ausführen muss. In der Praxis bedeutet dies, jedes Mal wenn ich eine Zeile Code zu ändern:Windows-Dienstanwendung ausführen, ohne sie zu installieren

  1. Schalter Entwickler Befehl kompilieren Prompt
  2. alte Version
  3. installieren neue Version entfernen
  4. Startservice

Das ist sehr unbequem. Gibt es einen besseren Weg, es zu tun?

Antwort

5

Normalerweise habe ich den Großteil der Service-Implementierung in eine Klassenbibliothek und dann zwei "Front-Ends" für die Ausführung - Service-Projekt, das andere eine Konsole oder Windows-Formulare-Anwendung. Ich benutze die Konsole/Formularanwendung zum Debuggen.

Sie sollten sich jedoch der Unterschiede in der Umgebung zwischen der Debug-Erfahrung und der Ausführung als echter Service bewusst sein - z. Sie können versehentlich dazu kommen, dass Sie in einer Sitzung mit einem interaktiven Benutzer ausgeführt werden, oder (bei Winforms), wo eine Nachrichtenpumpe ausgeführt wird.

1

Sie können den Windows-Dienst nicht wie eine andere Konsole oder WinForms-Anwendung ausführen. Es muss von Windows selbst gestartet werden.

Wenn Sie keine Infrastruktur bereit zu verwenden haben, wie @Damien_The_Unbeliever suggeriert (was ich auch empfehle), können Sie den Dienst vom Debug-Speicherort installieren. Sie verwenden also installutil einmal und zeigen Sie auf die ausführbare Datei in /bin/debug. Dann starten Sie einen Dienst von services.msc und verwenden Sie Visual Studio > Debug > Attach to Process Menü und an den Windows-Dienst anschließen.

Sie können auch mit Thread.Sleep(10000) als der ersten Zeile in der Ihnen OnStart Anruf oder Debugger.Break() betrachten, um zu helfen zu können, befestigen, bevor der Dienst keine Arbeit ausführt. Vergessen Sie nicht, diese vor der Veröffentlichung zu entfernen.

0

Sie können Environment.UserInteractive Variable verwenden. Details der Implementierung here

7

Der beste Weg ist meiner Meinung nach, Debug Direktive zu verwenden. Unten ist ein Beispiel für dasselbe.

#if(!DEBUG) 
    ServiceBase[] ServicesToRun; 
    ServicesToRun = new ServiceBase[] 
    { 
     // Calling MyService Constructor 
      new MyService() 
    }; 
    ServiceBase.Run(ServicesToRun); 
#else 
    MyService serviceCall = new MyService(); 
    serviceCall.YourMethodContainingLogic(); 
#endif 

Hit F5 und legen Sie einen Breakpoint auf YourMethodContainingLogic Methode, um es zu debuggen.

Verwandte Themen