webentwicklung-frage-antwort-db.com.de

ausführen des (F5) Windows-Dienstes von Visual Studio

So führen Sie ein Windows-Dienstprojekt in Visual Studio aus.

Ich baue ein Windows-Dienst in Visual Studio 2008 auf. Ich muss den Dienst immer über die Systemsteuerung ausführen und dann den Debugger an die ausgeführte Instanz des Diensts anschließen. Es ist nervig, da ich viel Code bereinige und meinen Dienst während der Entwicklung viele Male neu starten muss.

Ich möchte mein Projekt einrichten, um F5 drücken zu können, den Dienst auszuführen und direkt in den Debug-Modus zu gelangen. Einige Tipps, wie man dies erreichen kann, wären großartig. 

Danke im Voraus!!!

28
dotnetcoder

Kopieren von hier .

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 Ihnen die Ausführung in Visual Studio ermöglichen.

Eine andere Möglichkeit wäre, einen programmatischen Haltepunkt in den Code einzubetten, indem Sie System.Diagnostics.Debugger.Break() aufrufen. Wenn Sie dies beispielsweise im OnStart () - Callback Ihres Dienstes platzieren und den Dienst über die Dienstekonsole starten, löst der programmatische Haltepunkt ein Dialogfeld aus, in dem Sie eine Verbindung zu einer vorhandenen Instanz von Visual Studio herstellen oder eine neue starten können Beispiel. Dies ist der Mechanismus, den ich zum Debuggen meines Dienstes verwende.

27
Matt Davis

Suchen Sie in Ihrer Routine Main() nach Debugger.IsAttached. Wenn dies der Fall ist, starten Sie Ihre App wie eine Konsole. Wenn nicht, rufen Sie ServiceBase.Run() auf.

6
Samuel Neff

Es ist möglich, ein Begleitprojekt für den Windows-Dienst einzurichten, der als Konsolenanwendung ausgeführt wird, jedoch mithilfe von Reflection auf die Dienstmethoden zugreift. Einzelheiten und ein Beispiel finden Sie hier: 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
    }
  }
}
4
Ryan Kohn

Erstellen Sie ein separates Projekt, das nur auf das Serviceprojekt verweist, und instanziieren und starten Sie den Service. Es läuft einfach wie eine normale App und Sie können hineingehen.

YourService s = new YourService();
s.Start();
2
Patrick Kafka

Sie können dies auch tun: (Erläuterungen siehe Kommentare)

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();
    }       
}
2
MannyRamirez

Rufen Sie einfach das Ereignis OnStart () vom Service-Konstruktor auf

Ich habe es auf folgende Weise gemacht

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

Sie möchten Ihren Windows-Dienst als Shell haben, da dort wenig Code enthalten sein muss, müssen Sie ihn nicht testen.

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

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

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

Wird ein Ereignisprotokoll angezeigt, können Sie sehen, was Ihr Dienst während der Ausführung ausführt. Eine gute Möglichkeit, dies zu testen: Versuchen Sie es.

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
Pomster

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

Dies ist ein Spaziergang, wenn Sie sie erstellen http://msdn.Microsoft.com/de-de/library/zt39148a.aspx

James Michael Hare hat in seinem Blog http://geekswithblogs.net/BlackRabbitCoder/ über ein wirklich schönes Template/Framework geschrieben, das er erstellt hat, was es viel einfacher macht, Windows Services zu entwickeln (und zu debuggen): C # Toolbox: A Debugbare, selbstinstallierende Windows-Dienstvorlage (1 von 2) http://geekswithblogs.net/BlackRabbitCoder/archive/2010/09/23/c-windows-services-1-of-2-creating-a-debuggable -windows.aspx

Sie erhalten alle Grundlagen, die Sie für einen schnellen Einstieg benötigen. Und das Beste von allem ist, dass Sie eine wirklich schöne Möglichkeit haben, Ihren Service zu debuggen, als wäre es eine normale Konsolenanwendung. Ich könnte auch erwähnen, dass es eine sofortige Funktionalität für die Installation (und Deinstallation) Ihres Dienstes bietet. Teil zwei des Beitrags finden Sie unter diesem Link.

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

0
Pomster