2016-06-10 4 views
0

Derzeit bei der Entwicklung eines Windows-Dienstes ändern ich die Csproj, um den OutputType auf Exe im Debug-Modus zu setzen, damit ich ein Konsolenfenster bekomme und ich den Dienst leicht debuggen kann.Kompilieren eines Windows-Dienstes mit einem Ausgabetyp von Exe

Worüber ich neugierig bin ist, gibt es irgendein Problem damit, es im Release-Modus so in Produktion zu bringen? Ich sehe das Konsolenfenster nicht, es wird anscheinend nicht angezeigt oder ausgeblendet oder nicht erstellt, wenn der Dienst über InstallUtil installiert und dann gestartet wird.

Irgendwelche Gedanken?

+0

Trace-Ausgabe für Debugging-Zwecke nur so einfach wäre, und würde nicht den Dienst erfordert eine erstellen Konsolenfenster. Sie könnten es sogar in Release-Builds lassen. –

+0

Ich benutze Trace-Ausgabe, sowie viele andere konfigurierbare Logging-Optionen. Der Punkt war einfach, wenn es einen negativen Einfluss auf die Erstellung als Konsolen-App bei der Bereitstellung in der Produktion hatte. –

Antwort

2

Die meisten Dienste sind normalerweise exe-Ausgangstypen. Und ja, es wird keine Konsole geben, wenn es als Dienst läuft, aber solange Sie nichts von der Konsole lesen, sollte das kein Problem sein. Sie können als Service auf die Konsole schreiben und der Text wird vom System ignoriert.

Normalerweise mache ich das Programm beobachten für die Zeichenfolge --debug, um als Befehlszeilenparameter übergeben werden, wenn es beginnt den Dienst als eine Konsole App und wenn nicht startet es als Dienst . Hier ist ein Beispiel dafür, wie es zu tun:

static void Main(string[] args) 
{ 
     var debugMode = args.Contains("--debug", StringComparer.InvariantCultureIgnoreCase); 

     if (!debugMode) 
     { 
      ServiceBase[] servicesToRun = 
      { 
       new MyService(); 
      }; 
      ServiceBase.Run(servicesToRun); 
     } 
     else 
     { 
      var service = new MyService(); 
      service.StartService(args); 
      Console.WriteLine("Service is now running, press enter to stop..."); 
      Console.ReadLine(); 
      service.StopService(); 
     } 
    } 
} 

dann innerhalb des Service-Code ich

public partial class MyService : ServiceBase 
{ 
    internal void StartService(string[] args) 
    { 
     OnStart(args); 
    } 

    internal void StopService() 
    { 
     OnStop(); 
    } 

    //... The rest of the code here 
} 
+0

Danke für diese Antwort. Du hast es auf den oberen Teil gelegt, und die untere Hälfte, denke ich, wird anderen Entwicklern helfen. Ich mache etwas ähnliches, aber wir verwenden keine Befehlszeilenargumente. Hier ist ein Überblick, wie wir mit der Abhängigkeitsinjektion und dem bedingten Attribut beginnen. https://gist.github.com/jsheldon/95ee922088abf28eb6ec04dcdd1e1fb2 –

Verwandte Themen