2011-10-23 3 views
1

Je crée une application de service Windows dans Visual Studio 2010 Ultimate SP1.Comment déboguer des applications de service Windows?

je suivais 'Comment' de MSDN: http://msdn.microsoft.com/en-us/library/7a50syb3.aspx

J'ai rencontré deux problèmes:

  1. Je ne peux pas lancer un service via le serveur Explorer - mon service y est répertorié, mais le menu contextuel J'ai seulement deux options disponibles: Actualiser et Propriétés. Il n'y a pas de "Démarrer" si la documentation MSDN dit qu'il devrait y avoir cette option. Heureusement, je peux éviter ce problème en utilisant Services Control Manager. L'étape suivante est: "Dans Visual Studio, choisissez Processus dans le menu Déboguer". Cette option n'existe pas dans le menu Déboguer. Je n'ai que "Attach to Process", mais les services ne sont pas listés ici.

Est-ce que quelqu'un sait ce qui est mal et comment je suis censé déboguer ma demande?

Merci d'avance.

+0

http://stackoverflow.com/questions/125964/easier-way-to-start-debugging-a-windows-service-in-c-sharp –

Répondre

2

Comme une pensée: J'ai construit beaucoup de services Windows et pour l'une des nombreuses raisons, je ne crée pas le code de base dans le service lui-même. Le service est essentiellement la "couche opérationnelle", si vous voulez. La création du code principal dans une DLL permet le débogage et le test de ce code particulier. Vous pouvez créer une console ou une application de bureau qui exécutera le code principal qui peut être utilisé pendant les phases de développement et de test.

Personnellement, j'ai créé une application de service runner qui capture la journalisation en conjonction avec les fonctionnalités de démarrage et d'arrêt. Mes blocs de code OnStart et OnStop sont littéralement identiques à ceux du service.

Ensuite, lorsque vous testez le service, vous devriez pouvoir démarrer le service (par exemple, myService.exe) et le joindre au processus. Cependant, une autre remarque est que vous devriez faire une pause/attendre le thread de service (par exemple 30 secondes) avec une construction de débogage afin que vous ayez le temps de vous attacher au processus et que vous ne manquiez pas votre code d'initialisation. Rappelez-vous juste, vous devez installer votre service puis commencer par le gestionnaire de service de Windows.

Voici un code qui pourrait vous pointer dans la direction que j'utilise. Dans le fichier program.cs de service j'utilise le ci-dessous; puis dans la méthode Service OnStart(), vous appelez votre DLL et exécutez. En outre, vous pouvez arrêter votre service, remplacer la DLL par une version mise à jour, puis redémarrer. Avec C#, vous pouvez remplacer le service exe, mais ce ne sont que des caractéristiques C#: en C++, vous ne pouvez pas.

static class Program 
{ 
    public const string SERVICE_NAME = "myService"; 
    public const string SERVICE_DISPLAY_NAME = "My Service"; 

    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    static void Main(string[] args) 
    { 
     if (args != null && args.Length > 0) 
     { 
      foreach (string arg in args) 
      { 
       switch (arg.ToLower()) 
       { 
        case "-install": 
         ManageService(true); 
         return; 

        case "-remove": 
         ManageService(false); 
         return; 
       } 
      } 


     } 

     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] 
       { 
        new Service() 
       }; 
     ServiceBase.Run(ServicesToRun); 
    } 

    private static void ManageService(bool bInstall) 
    { 
     string parms; 

     if (bInstall == true) 
     { 
      parms = string.Format("Create {0} type= own start= demand binPath= \"{1}\" DisplayName= \"{2}\"", SERVICE_NAME, 
            System.Reflection.Assembly.GetExecutingAssembly().Location, SERVICE_DISPLAY_NAME); 
     } 
     else // remove 
     { 
      parms = string.Format("Delete {0}", SERVICE_NAME); 
     } 

     try 
     { 
      string output = string.Empty; 
      System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
      System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo("sc.exe", parms); 

      startInfo.UseShellExecute = false; 
      startInfo.RedirectStandardOutput = true; 
      startInfo.RedirectStandardError = true; 
      startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
      startInfo.CreateNoWindow = true; 

      proc.StartInfo = startInfo; 

      proc.Start(); 

      output = proc.StandardOutput.ReadToEnd(); 

      proc.WaitForExit(10000); 

      if (proc.HasExited == true) 
      { 
       // NOTE: The project type has been changed from Windows Service to Console Application 
       // so that Console.WriteLine will output to the console 
       Console.WriteLine(output); 
      } 
      else 
      { 
       proc.Close(); 
       Console.WriteLine("Timed out waiting to install service"); 
      } 
     } 
     catch (System.ComponentModel.Win32Exception) 
     { 
      Console.WriteLine("Unable to locate sc.exe"); 
     } 
    } 
} 
0
//From the main function a method from service class can be called like below code 


//DebugApp method can be called from main and so the service can be debug: 
//Service class  
public partial class CServices : ServiceBase 
{ 
    public CServices() 
    { 
     InitializeComponent(); 
    } 

    **public void DebugApp() 
    { 
     OnStart(new string[]{}); 
    }** 
    protected override void OnStart(string[] args) 
    { 
     System.Console.WriteLine("Testing"); 
     System.Console.Read(); 
    } 

    protected override void OnStop() 
    { 
    } 
} 


//Calling from main: 

    static void Main() 
    { 
     Services1.CServices uc = new CServices(); 
     uc.DebugApp(); 
    } 
Questions connexes