web-dev-qa-db-fra.com

comment exécuter le service Windows (F5) à partir de Visual Studio

Comment exécuter un projet de service Windows à partir de Visual Studio.

Je construis un service Windows dans Visual Studio 2008; je dois toujours exécuter le service à partir du panneau de configuration, puis attacher le débogueur à une instance en cours d'exécution du service. C'est un peu gênant puisque je nettoie beaucoup de code et que je dois redémarrer mon service plusieurs fois au cours du développement.

Je souhaite configurer mon projet de manière à pouvoir appuyer sur F5, exécuter le service et accéder directement au mode débogage. Quelques conseils sur la façon de réaliser cela seraient formidables. 

Merci d'avance!!!

28
dotnetcoder

Copié de ici .

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);  
    }  
}  

Cela devrait vous permettre de fonctionner à partir de Visual Studio.

Une autre solution consisterait à intégrer un point d'arrêt par programmation dans votre code en appelant System.Diagnostics.Debugger.Break(). Par exemple, lorsque vous placez cette option dans le rappel OnStart () de votre service et démarrez votre service à partir de la console Services, le point d'arrêt par programmation déclenche une boîte de dialogue vous permettant de vous connecter à une instance existante de Visual Studio ou de démarrer une nouvelle. exemple. C'est en fait le mécanisme que j'utilise pour déboguer mon service.

27
Matt Davis

Dans votre routine Main(), recherchez Debugger.IsAttached et, dans l'affirmative, démarrez votre application comme s'il s'agissait d'une console. Sinon, appelez ServiceBase.Run().

6
Samuel Neff

Il est possible de configurer un projet associé au service Windows qui s'exécute en tant qu'application console, mais accède aux méthodes de service à l'aide de Reflection. Voir ici pour plus de détails et un exemple: http://ryan.kohn.ca/articles/how-to-debug-a-windows-service-in-csharp-using-reflection/ .

Voici le code pertinent dont vous aurez besoin dans l'application console:

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

Créez un projet séparé qui ne fait que référencer le projet de service, instanciez et démarrez le service. Il fonctionne comme une application normale et vous pouvez y entrer.

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

Vous pouvez aussi faire ceci: (Voir les commentaires pour les explications)

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

Il suffit d'appeler l'événement OnStart () à partir du constructeur de service

Je l'ai fait de la manière suivante

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

Vous voulez avoir votre service Windows en tant que Shell, il devrait contenir peu de code afin de ne pas avoir à le tester.

Vous devriez avoir tout ce que vous voulez que votre service fasse dans une classe. 

Vous pouvez tester votre classe et si cela fonctionne, faites-en référence à votre service.

De cette façon, lorsque vous avez la classe qui fait tout ce que vous voulez, puis que cela s'applique à votre service, tout devrait fonctionner. :)

Un journal d’événements vous permettra-t-il de voir ce que votre service fait pendant son exécution, également un bon moyen de tester: Essayez-le.

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

Ces liens peuvent être très utiles lorsque vous travaillez avec des services.

C’est pourtant une marche à suivre pour les créer http://msdn.Microsoft.com/en-us/library/zt39148a.aspx

James Michael Hare a écrit sur son blog http://geekswithblogs.net/BlackRabbitCoder/ sur un modèle/framework vraiment sympa qu'il a créé, facilitant ainsi le développement (et le débogage) de Windows Services: C # Toolbox: A Modèle de service Windows auto-installable et débogable (1 sur 2) http://geekswithblogs.net/BlackRabbitCoder/archive/2010/09/23/c-windows-services-1-of-2-creating-a-debuggable -windows.aspx

Il vous fournit toutes les bases dont vous avez besoin pour commencer rapidement. Et le meilleur de tous, cela vous donne un très bon moyen de déboguer votre service comme s'il s'agissait d'une application console classique. Je pourrais également mentionner qu'il fournit des fonctionnalités prêtes à l'emploi pour installer (et désinstaller) votre service. La deuxième partie de l'article peut être trouvée à ce lien.

Je l'ai utilisé moi-même plusieurs fois et je le recommande vraiment.

0
Pomster