27

Wie man ein Windows-Service-Projekt von Visual Studio ausführen.wie man (F5) windows service von visual studio

Ich baue einen Windows-Dienst in Visual Studio 2008, ich muss den Dienst immer über Systemsteuerung ausführen und dann den Debugger an laufenden Instanz des Dienstes anhängen. Es ist nervig, da ich viel Code putze und meinen Dienst während der Entwicklung mehrmals neu starten muss.

Ich möchte mein Projekt so einrichten, dass ich F5 drücken und den Dienst ausführen und direkt in den Debug-Modus wechseln kann. Einige Tipps, wie dies zu erreichen wäre, wären großartig.

Vielen Dank im Voraus !!!

+0

diesen Artikel http Aussehen://msdn.microsoft.com/en-us/library/7a50syb3(v=vs.80).aspx. Es bezieht sich auch auf die folgenden Artikel: http://msdn.microsoft.com/en-us/library/htkdfk18(v=vs.80).aspx http://msdn.microsoft.com/en-us /library/ddhy0byf(v=vs.80).aspx –

Antwort

6

In Ihrem Main() Routine-Check für Debugger.IsAttached und wenn es wahr ist Ihre Anwendung zu starten, als ob es sich um eine Konsole ist, wenn nicht, in ServiceBase.Run() nennen.

2

Erstellen Sie ein separates Projekt, das nur auf das Serviceprojekt verweist und den Service instanziiert und startet. Es läuft einfach wie eine normale App und du kannst hineintreten.

YourService s = new YourService(); 
s.Start(); 
25

Kopiert von here.

static void Main(string[] args) 
{ 
    DemoService service = new DemoService(); 

    if (Environment.UserInteractive) 
    { 
     service.OnStart(args); 
     Console.WriteLine("Press any key to stop program"); 
     Console.Read(); 
     service.OnStop(); 
    } 
    else 
    { 
     ServiceBase.Run(service); 
    } 
} 

Dies sollte es Ihnen ermöglichen, von Visual Studio aus zu starten.

Eine andere Möglichkeit wäre, einen programmatischen Haltepunkt in Ihren Code einzubinden, indem Sie System.Diagnostics.Debugger.Break() aufrufen. Wenn Sie das beispielsweise in den OnStart() - Callback Ihres Dienstes eingeben und Ihren Dienst über die Services-Konsole starten, löst der programmatische Haltepunkt ein Dialogfeld aus, mit dem Sie eine vorhandene Visual Studio-Instanz anfügen oder eine neue starten können Beispiel. Dies ist der Mechanismus, mit dem ich meinen Dienst debuggen kann.

+3

Die Anweisungen bei diesem Link funktionieren perfekt für mich. Vielen Dank! –

+0

Nur zur Info, in Windows 8 scheint es, dass sie einige Änderungen an den Windows-Diensten vorgenommen haben und ihre Fähigkeit, interaktive Dinge zu tun, stark eingeschränkt haben. Debugger.Launch() und Debugger.Break() scheinen nicht länger den GUI-Dialog auszulösen, der es Ihnen erlaubt, zu wählen und IDE zu debuggen, so dass der Dienst einfach hängen bleibt. FYI –

2

Rufen Sie die OnStart() Ereignis aus dem Service-Konstruktor

Ich habe es in der folgenden Art und Weise

public XXX() 
    { 
     InitializeComponent(); 
     OnStart(new string[] { "shafi", "moshy" }); 
    } 
0

Sie möchten Ihre Windows-Dienst als Shell haben, sollte es wenig Code sein in Da musst du es nicht testen.

Sie sollten alles haben, was Ihr Service in einer Klasse tun soll.

Sie können Ihre Klasse testen und wenn es funktioniert, dann verweisen Sie es auf Ihren Service.

Auf diese Weise, wenn Sie Klasse haben, tun Sie alles, was Sie wollen, dann, wenn es auf Ihren Dienst angewendet wird, sollte alles funktionieren. :)

Wird ein Ereignisprotokoll Sie können sehen, was Ihr Dienst tut, während es ausgeführt wird, auch eine nette Möglichkeit zu testen: D versuchen, dass.

namespace WindowsService 
{ 
    public partial class MyService : ServiceBase 
    { 
     public MyEmailService() 
     { 
      InitializeComponent(); 
      if (!System.Diagnostics.EventLog.SourceExists("MySource")) // Log every event 
      { 
       System.Diagnostics.EventLog.CreateEventSource(
        "MySource", "MyNewLog"); // Create event source can view in Server explorer 
      } 
      eventLogEmail.Source = "MySource"; 
      eventLogEmail.Log = "MyNewLog"; 

      clsRetriveEmail Emails = new clsRetriveEmail(); 
      eventLogEmail.WriteEntry("Populateing database with mail"); // log event 
      Emails.EmailGetList(); // Call class 
     } 
     protected override void OnStart(string[] args) 
     { 
      eventLogEmail.WriteEntry("Started"); 
     } 
     protected override void OnStop() 
     { 
      eventLogEmail.WriteEntry("Stopped"); 
     } 
     protected override void OnContinue() 
     {  
      eventLogEmail.WriteEntry("Continuing"); 
     } 
     } 
    } 
0

Diese Links können bei der Arbeit mit Services sehr hilfreich sein.

Dies ist ein Spaziergang durch auf sie http://msdn.microsoft.com/en-us/library/zt39148a.aspx

James Michael Hare auf seinem Blog über eine wirklich schöne Vorlage/Rahmen http://geekswithblogs.net/BlackRabbitCoder/ geschrieben hat die Schaffung er gemacht hat, ist es viel einfacher zu entwickeln (und debug) Windows Services : C# Toolbox: Eine debuggable, selbstinstallierende Windows-Servicevorlage (1 von 2) http://geekswithblogs.net/BlackRabbitCoder/archive/2010/09/23/c-windows-services-1-of-2-creating-a-debuggable-windows.aspx

Es bietet Ihnen alle Grundlagen, die Sie benötigen, um schnell zu beginnen. Und das Beste von allem, es gibt Ihnen eine sehr gute Möglichkeit, Ihren Dienst zu debuggen, als wäre es eine normale Konsolenanwendung. Ich könnte auch erwähnen, dass es eine Out-of-the-Box-Funktionalität bietet, um Ihren Dienst zu installieren (und zu deinstallieren). Teil zwei der Post finden Sie unter diesem Link.

Ich habe das selbst ein paar Mal verwendet, und kann es wirklich empfehlen.

3

Es ist möglich, ein Begleitprojekt für den Windows-Dienst einzurichten, der als Konsolenanwendung ausgeführt wird, aber auf die Dienstmethoden mit Reflection zugreift. Hier finden Sie Details und ein Beispiel: http://ryan.kohn.ca/articles/how-to-debug-a-windows-service-in-csharp-using-reflection/.

Hier ist der relevante Code, den Sie in der Konsolenanwendung benötigen:

using System; 
using System.Reflection; 

namespace TestableWindowsService 
{ 
    class TestProgram 
    { 
    static void Main() 
    { 
     Service1 service = new Service1(); 

     Type service1Type = typeof (Service1); 

     MethodInfo onStart = service1Type.GetMethod("OnStart", BindingFlags.NonPublic | BindingFlags.Instance); //retrieve the OnStart method so it can be called from here 

     onStart.Invoke(service, new object[] {null}); //call the OnStart method 
    } 
    } 
} 
2

Sie dies auch tun können: (Siehe Anmerkungen zur Erläuterung)

public class Program : ServiceBase 
{ 
    private ServiceHost _serviceHost = null; 
    public Program() 
    { 
     ServiceName = ""; 
    } 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    static void Main() 
    { 
       #if(!DEBUG) 
       // when deployed(built on release Configuration) to machine as windows service use this 
        ServiceBase[] ServicesToRun; 
        ServicesToRun = new ServiceBase[] { new Program() }; 
        ServiceBase.Run(ServicesToRun); 
       #else 
       // when debugging use this (When debugging after building in Debug Configuration) 
       //If you want the DEBUG preprocessor constant in Release you will have to check it on in the project configuration 
       Program progsvc = new Program(); 
       progsvc.OnStart(new string[] { }); 
       System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite); 
       #endif       
    } 
    protected override void OnStart(string[] args) 
    { 
       // Start Web Service 
       if (_serviceHost != null) 
       { 
        _serviceHost.Close(); 
       } 
       _serviceHost = new ServiceHost(typeof(Namespace.Service)); 
       _serviceHost.Open(); 
    }  
} 
Verwandte Themen