41 votes

Service de débogage Windows

Scénario

J'ai un service windows écrit en C#. J'ai lu tous les google threads sur la façon de le corriger, mais je ne peux toujours pas le faire fonctionner. J'ai exécuter "PathTo.NetFramework\InstallUtil.exe C:\MyService.exe". Il dit que l'installation a réussi, cependant, quand je lance "des Services.msc", Le service n'est pas affiché à tous, n'importe où. Si je vais dans le Gestionnaire des Tâches, il y a un processus appelé "MyService.vshost.exe". Assez sûr que ce n'est pas ça, parce que c'est un service, non d'un processus.

Quelqu'Un Peut M'Expliquer?

Si je suis censé voir le service, quand je lance des Services.msc? (En gardant à l'esprit que c'est fait sur une machine locale, avec pas de serveurs À TOUS.

D'autres

Je suis sous VS2008.

EDIT:

Tout cela est fait sur ma machine locale, je n'ai pas de serveurs ou l'accès à tout. Aussi, je ne sais même pas ce que fait le service, je veux le corriger afin que je puisse procédure pas à pas le code et de voir comment tout cela fonctionne (le code à l'intérieur du service, et non pas le service lui-même - pour vous smarty pants qui pourrait indiquer que je regarde d'un modèle).

EDIT 2:

AUCUNE DE CES SONT DE TRAVAIL! Chaque fois que je tente quelque chose, je reçois un message d'avoir à utiliser des NET DÉMARRER ou installer le service.

EDIT 3:

Je suis sous VS2008.

J'ai tapé ceci: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe C:\dev\Restarter\bin\Release\Restarter.exe

J'ai obtenu ceci: Microsoft (R) .NET Framework Installation de la Version de l'utilitaire de 2.0.50727.3053 Copyright (c) Microsoft Corporation. Tous droits réservés.

Exécution d'une installation négociée.

Début de l'Installation de la phase de l'installation. Voir le contenu du fichier journal pour le C:\dev\Restarter\bin\ Release\Restarter.exe l'assemblée progrès. Le fichier est situé à C:\dev\Restarter\bin\Release\EDT.Restar ter.InstallLog. L'installation de l'assembly 'C:\dev\Restarter\bin\Release\Restarter.exe'. Les paramètres affectés sont: logtoconsole = assemblypath = C:\dev\Restarter\bin\Release\Restarter.exe logfile = C:\dev\Restarter\bin\Release\Restarter.InstallLog

L'Installation a terminé l'étape avec succès, et la phase de validation est un début. Voir le contenu du fichier journal pour le C:\dev\Restarter\bin\ Release\Restarter.exe l'assemblée progrès. Le fichier est situé à C:\dev\Restarter\bin\Release\Restar ter.InstallLog. Commettre l'assembly 'C:\dev\Restarter\bin\Release\Restarter.exe'. Les paramètres affectés sont: logtoconsole = assemblypath = C:\dev\Restarter\bin\Release\Restarter.exe logfile = C:\dev\Restarter\bin\Release\Restarter.InstallLog

La phase de validation est terminée avec succès.

Le transactionnels à l'installation terminée.

C:\Program Files\Microsoft Visual Studio 9.0\VC>

Ensuite, je suis allé à EXÉCUTER -> Services.msc Je vois rien là-dedans.

Il y a un processus dans le Gestionnaire des Tâches appelé "Restarter.vshost.exe".

C'est tout.

Je voulais seulement à installer et à déboguer. Je sais que ça fonctionne (comme il s'exécute, et ne tombe pas en panne). Mais le code a été écrit par un ami et je veux comprendre le code sous-jacent par la marche à travers elle dans le mode de débogage.

116voto

Andrey Points 36869

Je recommande le modèle suivant pour le débogage:

  var ServiceToRun = new SomeService(); 
 if (Environment.UserInteractive)
 {
    // This used to run the service as a console (development phase only)

    ServiceToRun.Start();

    Console.WriteLine("Press Enter to terminate ...");
    Console.ReadLine();

    ServiceToRun.DoStop();
 }
 else
 {
    ServiceBase.Run(ServiceToRun);
 }
 

Edit: assurez-vous que votre cible est une application console, et non une application Windows, sinon elle ne fonctionnera pas.

23voto

Sam Holder Points 13935

vous pouvez le déboguer en attachant le débogueur au processus. Vous pouvez le faire en ajoutant une ligne au démarrage de votre programme:

 Debugger.Launch ();
 

après avoir ajouté l'instruction using:

 using System.Diagnostics; 
 

soit vous aurez besoin de mettre cela dans un bloc conditionnel ou de le supprimer quand vous aurez fini de déboguer

ou en exécutant le service puis en joignant le processus manuellement à partir de l'EDI: Debug-> Attach to process.

6voto

Lavanya Points 61

Nous pouvons rendre le projet de service Windows débogable en ajoutant simplement un paramètre et en le faisant se comporter comme une application console.

1) Allez dans les propriétés de votre projet de service Windows -> Débogage -> Options de démarrage 2) Donnez un argument - Console 3) Allez dans l’onglet Application -> type de sortie, changez-le en Console Application 4) Tapez le code ci-dessous dans Program.cs

 static class Program
    {
        private static EventWaitHandle _waitHandle;
        private static Service1 _service;
                static void Main(string[] args)
        {
            bool runConsole = false;**

            foreach (string arg in args)
            {
                if (arg.ToLowerInvariant().Equals("-console"))
                {
                    runConsole = true;
                }
            }   

            _service = new Service1();
            if (runConsole)
            {
                _waitHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
                Console.WriteLine("Starting Workflow Service in Console Mode");
                Console.WriteLine("Press Ctrl+C to exit Console Mode");
               Console.CancelKeyPress += new ConsoleCancelEventHandler(OnCancelKeyPress);
                _service.InternalStart();
                WaitHandle.WaitAll(new WaitHandle[] { _waitHandle });
            }

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

        static void OnCancelKeyPress(object sender, ConsoleCancelEventArgs e)
        {
            _service.InternalStop();
            _waitHandle.Set();
        }


    }
 

5voto

Ronnie Overby Points 11402

Cela m'a beaucoup aidé lors du développement / débogage des services Windows:

http://windowsservicehelper.codeplex.com/

Appuyez simplement sur F5 pour déboguer. Très facile.

L'approche de Andreï est également très bonne.

4voto

Minas Points 51

Pour pouvoir déboguer mon service sans le déployer, je l'écris toujours de la manière suivante:

Dans votre fichier program.cs:

 #if DEBUG
    MyService myService = new MyService();
    myService.OnDebug();
    System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
#else
    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[]
    {
        new MyService()
    };
    ServiceBase.Run(ServicesToRun);
#endif
 

et dans votre fichier MyService.cs:

     public void OnDebug()
    {
        OnStart(null);
    }
 

* NOTE * : Vous devez créer en mode 'Release' lorsque vous avez terminé le débogage et que vous êtes prêt à déployer le service, sinon le service ne sera pas considéré comme un service.

J'espère que cela t'aides.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X