Débogage d'un Service Windows en .NET
A l'occasion d'un projet, j'ai du faire un peut de débogage sur une appli de type Service Windows déjà existante. Et comme le code UI (si on peut l'appeler comme ca) et le code métier étaient imbriqués, il m'a fallu trouver une solution simple me permettant de lancer le tout sous VS.NET sans me compliquer la vie.
Habituellement, quand les 2 parties sont bien séparées dans des assembly distincts, il suffit de faire un petit projet type WinForms ou Console et d'y instancier le code métier (en gros un copier/coller de la fonction OnStart du service dans le Main de l'appli console.)
Dans la classe du service :
#if DEBUG
private static MyService m_serv = new MyService();
#endif
static void Main()
{
#if !DEBUG
System.ServiceProcess.ServiceBase[] ServicesToRun;
// More than one user Service may run within the same process. To add
// another service to this process, change the following line to
// create a second service object. For example,
//
// ServicesToRun = New System.ServiceProcess.ServiceBase[] {new MyService(), new MySecondUserService()};
//
ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyService() };
System.ServiceProcess.ServiceBase.Run(ServicesToRun);
#else
m_serv.OnStart (new string[0]);
System.Windows.Forms.Application.ApplicationExit += new EventHandler(Application_ApplicationExit);
System.Windows.Forms.Application.Run (new dbgForm());
#endif
}
#if DEBUG
private static void Application_ApplicationExit( object sender, EventArgs e)
{
m_serv.OnStop();
}
#endif
Dans un fichier à part :
#if DEBUG
internal class dbgForm : System.Windows.Forms.Form
{
public dbgForm ()
{
this.Width = 400;
this.Height = 20;
this.Text = "MyService (Debug Mode)";
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;
}
}
#endif
Et voila du coup, après quand vous lancer votre projet en mode Debug, une fenêtre apparait. Alors qu'en mode Release le service ne peut être lancer que par le service manager de NT (2000/XP/2003).
Attention tout de même, cette astuce permet de debugger facilement un service, mais le programme n'est pas lancer par le même compte utilisateur. Il vous restera donc peut-être des problème de droits d'accès.
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :