Service Windows de débogage

Scénario

J’ai un service Windows écrit en C #. J’ai lu tous les fils de Google sur la façon de le déboguer, mais je n’arrive toujours pas à le faire fonctionner. J’ai exécuté “PathTo.NetFramework \ InstallUtil.exe C: \ MyService.exe”. Il a déclaré que l’installation avait réussi, mais lorsque je lance “Services.msc”, le service ne s’affiche pas du tout, où que ce soit. Si je vais dans le Gestionnaire des tâches, il existe un processus appelé “MyService.vshost.exe”. Bien sûr, ce n’est pas ça, parce que c’est un service, pas un processus.

Quelqu’un peut-il m’expliquer?

Si je suis censé voir le service lorsque je lance Services.msc? (Gardant à l’esprit que tout cela se fait sur une machine locale, sans serveurs du tout.

Autre

Je cours VS2008.

MODIFIER:

Tout cela se fait sur ma machine locale, je n’ai aucun serveur ni access à aucun. De plus, je ne sais même pas ce que fait le service, je veux le déboguer pour que je puisse passer en revue le code et voir comment tout fonctionne (le code à l’intérieur du service, pas le service lui-même – pour Je suggère de regarder un modèle).

EDIT 2:

AUCUN DE CES TRAVAILLENT! Chaque fois que j’essaie quelque chose, je reçois un message sur l’utilisation de NET START ou l’installation du service.

EDIT 3:

Je cours VS2008.

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

J’ai ceci: Utilitaire d’installation Microsoft (R) .NET Framework Version 2.0.50727.3053 Copyright (c) Microsoft Corporation. Tous les droits sont réservés.

Exécuter une installation transactionnelle.

Début de la phase d’installation de l’installation. Voir le contenu du fichier journal pour la progression de l’assembly C: \ dev \ Restarter \ bin \ Release \ Restarter.exe. Le fichier se trouve dans C: \ dev \ Restarter \ bin \ Release \ EDT.Restar ter.InstallLog. Installation de l’assembly ‘C: \ dev \ Restarter \ bin \ Release \ Restarter.exe’. Les parameters concernés sont les suivants: logtoconsole = assemblypath = C: \ dev \ Restarter \ bin \ Release \ Restarter.exe fichier journal = C: \ dev \ Restarter \ bin \ Release \ Restarter.InstallLog

La phase d’installation s’est terminée avec succès et la phase de validation commence. Voir le contenu du fichier journal pour la progression de l’assembly C: \ dev \ Restarter \ bin \ Release \ Restarter.exe. Le fichier se trouve dans C: \ dev \ Restarter \ bin \ Release \ Restar ter.InstallLog. Commettant l’assembly ‘C: \ dev \ Restarter \ bin \ Release \ Restarter.exe’. Les parameters concernés sont les suivants: logtoconsole = assemblypath = C: \ dev \ Restarter \ bin \ Release \ Restarter.exe fichier journal = C: \ dev \ Restarter \ bin \ Release \ Restarter.InstallLog

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

L’installation effectuée est terminée.

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

Je suis ensuite allé à RUN -> Services.msc je ne vois rien là-dedans.

Il existe un processus dans le Gestionnaire des tâches appelé “Restarter.vshost.exe”.

C’est tout.

Je voulais seulement l’installer et le déboguer. Je sais que ça marche (comme ça tourne et ça ne plante pas). Mais le code a été écrit par un ami et je veux comprendre le code sous-jacent en le parcourant en mode débogage.

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 l’application console, pas l’application Windows, sinon cela ne fonctionnera pas.

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

 Debugger.Launch (); 

après avoir ajouté l’instruction using:

 using System.Diagnostics; 

vous devrez soit mettre cela dans un bloc conditionnel ou le supprimer lorsque vous avez terminé le débogage

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

Nous pouvons faire en sorte que le projet de service Windows puisse être débogué en ajoutant simplement un paramètre et en le faisant se comporter comme une application de console.

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

 static class Program { private static EventWaitHandle _waitHandle; private static Service1 _service; static void Main(ssortingng[] args) { bool runConsole = false;** foreach (ssortingng 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(); } } 

Cela m’a beaucoup aidé lors du développement / débogage de services Windows:

http://windowsservicehelper.codeplex.com/

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

L’approche d’Andrey est également très bonne.

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

* REMARQUE * : vous devez créer sous le mode ‘Release’ lorsque vous avez fini 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.

Hypothèses:

1) Vous avez le code source disponible dans une solution dans l’EDI VS2008

Comment déboguer les services C #:

  1. Installez le service à l’aide de InstallUtil . (Vous semblez avoir déjà fait ça)
  2. (Si nécessaire) Modifiez le chemin d’ access au service MyService.exe produit dans le dossier bin votre solution.
  3. Mettez quelque chose comme ceci au début de la méthode OnStart() de votre service:

     while(true) { System.Threading.Thread.Sleep(500); } 
  4. Mettez un point d’arrêt sur System.Threading.Thread.Sleep(500)

  5. Construire la solution

  6. Démarrez votre service à l’aide de l’ utilitaire de service Windows

  7. Pendant que votre service démarre, dans VS2008 goto Debug -> Attach To Processes...

  8. Assurez-vous que Show Processes From All Users et Show Processes In All Sessions est cochée

  9. Recherchez votre MyService.exe dans la liste, puis cliquez sur Attach

  10. Vous devriez maintenant être au point d’arrêt que vous avez inséré dans la boucle infinie

  11. Faites glisser le contrôle (flèche jaune) juste en dehors de la boucle infinie

  12. Débarrassez-vous!

Avertissement:

N’oubliez pas de supprimer la boucle infinie lorsque vous souhaitez publier une version ou lorsque vous souhaitez simplement exécuter le service normalement.

Il se peut que le nom du service ne soit pas ce que vous attendez et c’est pourquoi vous ne le trouvez pas. Le nom du service est défini dans les propriétés ServiceInstaller du projet .NET et ne doit pas nécessairement correspondre au nom de l’exécutable. Mais si vous êtes certain que le service n’est pas répertorié après l’installation, voici ce que vous pouvez faire.

Tout d’abord, l’installation du service. Il existe 2 méthodes, InstallUtil.exe et SC.exe . Le premier est spécialement conçu pour les services .NET car il exécutera tous les codes ProjectInstaller et ServiceInstaller . La seconde ne le fera pas mais cela vous donnera plus d’options et est généralement plus efficace, c’est-à-dire susceptible de réussir là où InstallUtil échoue. Cela peut se produire lorsqu’il existe une exception dans tout code d’installation.

Vous avez déjà essayé d’installer avec InstallUtil alors voici la version SC :

 sc create MyService binPath= "C:\Service.exe" 

Notez que MyService est le nom que vous donnez au service à ce stade et que cela peut vous intéresser (dans des limites raisonnables :-). Ce nom sera affiché dans la liste de la console de services.

Une fois votre service installé, vous devrez le déboguer dès l’ OnStart . Cela peut être réalisé en exécutant et en attachant à un débogueur (Visual Studio) à partir du service:

 protected override void OnStart(ssortingng[] args) { #if DEBUG Debugger.Launch(); #endif ... } 

N’oubliez pas de créer et de remplacer l’exécutable du service après ce changement de code. Le service doit être arrêté, mais pas besoin de le désinstaller et de le réinstaller.

Pour supprimer un service à l’aide de SC :

 sc delete MyService 

Si votre couche métier est distincte du service Windows, vous pouvez tester toutes les fonctions de votre entreprise en dehors du service Windows.

Pour tester le service Windows, j’aime créer un projet de test qui est une application console et démarrer un nouveau thread qui exécute mon service.

 System.Threading.Thread sftpThread = new System.Threading.Thread((ThreadStart)service1); service1.Start(); 

Je l’ai récemment ajouté à un projet et cela fonctionne très bien pour moi. Vous pouvez le déboguer comme n’importe quel autre EXE. Une fois ajouté, accédez aux propriétés de votre projet et ajoutez un paramètre de ligne de commande (/ EXE) dans l’onglet Débogage de la configuration de la génération Debug.

  _ Shared Sub Main() '' '' let's add a command line parameter so we can run this as a regular exe or as a service '' If Command().ToUpper() = "/EXE" Then Dim app As MyService = New MyService() app.OnStart(Nothing) Application.Run() Else Dim ServicesToRun() As System.ServiceProcess.ServiceBase ' More than one NT 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 Service1, New MySecondUserService} ' ServicesToRun = New System.ServiceProcess.ServiceBase() {New MyService} System.ServiceProcess.ServiceBase.Run(ServicesToRun) End If End Sub 

Je recommande d’append /test sur l’onglet de débogage des propriétés du projet comme option de démarrage. Ensuite, vous pouvez exécuter votre service sans avoir à l’installer.

Si vous créez votre service avec TopShelf, vous devriez pouvoir le déboguer facilement de Visual Studio