27

Comment exécuter un projet de service Windows à partir de Visual Studio.comment exécuter (F5) le service Windows à partir de Visual Studio

Je construis un serivce windows dans Visual Studio 2008, je dois toujours exécuter le service depuis le panneau de contrôle, puis attacher le débogueur à l'instance en cours d'exécution du service. C'est assez gênant car je nettoie beaucoup de code et j'ai besoin de redémarrer mon service plusieurs fois pendant le développement.

Je veux configurer mon projet de manière à pouvoir appuyer sur F5 et exécuter le service et passer directement en mode débogage. Quelques conseils sur la façon d'y parvenir seraient super.

Merci d'avance !!!

+0

Regardez cet article http://msdn.microsoft.com/en-us/library/7a50syb3(v=vs.80).aspx. Il fait également référence aux articles suivants: http://msdn.microsoft.com/en-us/library/htkdfk18(v=vs.80).aspx http://msdn.microsoft.com/fr-fr /library/ddhy0byf(v=vs.80).aspx –

Répondre

6

Dans votre routine Main() vérifiez Debugger.IsAttached et si c'est vrai, démarrez votre application comme si c'était une console, sinon appelez ServiceBase.Run().

2

Créez un projet distinct qui référence simplement le projet de service et instanciez et démarrez le service. Il fonctionne simplement comme une application normale et vous pouvez y entrer.

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

Copié à partir de 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); 
    } 
} 

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

Une autre solution consiste à incorporer un point d'arrêt programmatique dans votre code en appelant System.Diagnostics.Debugger.Break(). Lorsque vous placez cela dans, disons, le rappel OnStart() de votre service et démarrez votre service à partir de la console Services, le point d'arrêt programmatique déclenchera une boîte de dialogue qui vous permet d'attacher à 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.

+3

Les instructions à ce travail de lien parfaitement pour moi. Merci! –

+0

Juste pour info, dans Windows 8, il semblerait qu'ils ont apporté quelques modifications aux services Windows et réduit beaucoup leur capacité à faire des choses interactives. Debugger.Launch() et Debugger.Break() ne semblent plus déclencher la boîte de dialogue GUI qui vous permet de choisir et IDE pour déboguer afin que le service se bloque. FYI –

2

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

Je l'ai fait de la façon suivante

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

Vous voulez avoir votre service Windows comme une coquille, il devrait y avoir peu de code là, donc vous n'avez pas à 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, la référencer vers votre service. De cette façon, lorsque vous avez votre classe à faire tout ce que vous voulez, alors quand il est appliqué à votre service, tout devrait fonctionner. :)

Est-ce qu'un journal des événements, vous pouvez voir ce que votre service est en cours d'exécution, aussi une bonne façon de tester: D essayer cela.

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

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

Ceci est une promenade bien sur les créer http://msdn.microsoft.com/en-us/library/zt39148a.aspx

James Michael Hare a sur son blog http://geekswithblogs.net/BlackRabbitCoder/ écrit sur un modèle vraiment sympa/cadre qu'il a fait, ce qui rend beaucoup plus facile de développer (et debug) Services Windows : C# Toolbox: Un modèle de service Windows Debuggable, auto-installable (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 démarrer rapidement. Et le meilleur de tous, il vous donne un moyen très agréable de déboguer votre service comme si elle était une application console régulière. Je pourrais également mentionner qu'il fournit hors de la boîte la fonctionnalité pour installer (et désinstaller) votre service. La deuxième partie du post peut être trouvée sur ce lien.

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

3

Il est possible de configurer un projet compagnon pour le service Windows qui s'exécute en tant qu'application de 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 correspondant que vous aurez besoin dans l'application de la 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 
    } 
    } 
} 
2

Vous pouvez aussi le faire: (Voir les commentaires pour explication)

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(); 
    }  
} 
Questions connexes