J'ai un service Windows écrit en C # . J'ai lu toutes les discussions sur Google pour 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 dit que l'installation a réussi, cependant, lorsque j'exécute "Services.msc", le service n'est pas affiché du tout, nulle part. Si je vais dans le Gestionnaire des tâches, il y a un processus appelé "MyService.vshost.exe". Je suis presque sûr que ce n'est pas ça, parce que c'est un service, pas un processus.
Si je suis censé voir le service lorsque j'exécute Services.msc? (Sachant que tout cela est effectué sur une machine locale, sans serveur AT ALL.
Je cours VS2008.
Tout cela se fait sur ma machine locale, je n'ai ni serveur ni accès à aucun ..__En outre, je ne sais même pas ce que fait le service, je veux le déboguer pour pouvoir parcourir le code et voir comment il fonctionne. tout fonctionne (le code à l'intérieur du service, pas le service lui-même - pour l'un de vous smarty pantalons qui pourraient suggérer que je regarde un modèle).
AUCUN DE CEUX-CI NE TRAVAILLE! Chaque fois que j'essaie quelque chose, un message m'indique de devoir utiliser NET START ou d'installer le service.
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 obtenu ceci: Utilitaire d’installation de Microsoft .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 . Consultez le contenu du fichier journal pour C:\dev\Restarter\bin\ Release\Restarter.exe Progression de l'assemblage . Le fichier se trouve à l'emplacement C:\dev\Restarter\bin\Release\EDT.Restar ter.InstallLog . Installation de l’assemblage 'C:\dev\Restarter\bin\Release\Restarter.exe' . Les paramètres concernés sont les suivants: logtoconsole = assemblypath = C:\dev\Restarter\bin\Release\Restarter.exe logfile = C:\dev\Restarter\bin\Release\Restarter.InstallLog
La phase d'installation s'est terminée avec succès et la phase de validation commence ........ Consultez le contenu du fichier journal pour C:\dev\Restarter\bin\ Release\Restarter.exe Progression de l'assemblage . Le fichier se trouve dans C:\dev\Restarter\bin\Release\Restar ter.InstallLog . Validation de l’assemblage 'C:\dev\Restarter\bin\Release\Restarter.exe' . Les paramètres concernés sont les suivants: : logtoconsole = assemblypath = C:\dev\Restarter\bin\Release\Restarter.exe logfile = 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:\Programmes\Microsoft Visual Studio 9.0\VC>
Je suis ensuite allé à RUN -> Services.msc Je ne peux rien y voir.
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 cela fonctionne (car il fonctionne et ne tombe pas en panne) . Mais le code a été écrit par un ami et je veux comprendre le code sous-jacent en 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 une application console, et non une application Windows, sinon elle ne fonctionnera pas.
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.
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 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 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();
}
}
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.
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.
Hypothèses:
1) Vous avez le code source disponible dans une solution dans l'IDE VS2008
Comment je débogue les services C #:
InstallUtil
. (Vous semblez avoir déjà fait ça)bin
de votre solutionMettez quelque chose comme ceci au début de la méthode OnStart()
de votre service:
while(true)
{
System.Threading.Thread.Sleep(500);
}
Placez un point d'arrêt sur System.Threading.Thread.Sleep(500)
Construire la solution
Démarrez votre service à l’aide de Windows Service Utility
Pendant le démarrage de votre service, dans VS2008, passez à Debug -> Attach To Processes...
Assurez-vous que Show Processes From All Users
et Show Processes In All Sessions
sont cochés
Recherchez votre MyService.exe dans la liste et cliquez sur Attach
.
Vous devriez maintenant être au point d'arrêt que vous avez inséré dans la boucle infinie
Faites glisser le contrôle (flèche jaune) seulement en dehors de la boucle infinie
Déboguer!
Avertissement:
N'oubliez pas de supprimer la boucle infinie lorsque vous souhaitez publier une construction ou simplement exécuter le service normalement.
Il se peut que le nom du service ne soit pas ce que vous attendez et que vous ne puissiez pas le trouver. Le nom du service est défini dans les propriétés ServiceInstaller
du projet .NET et ne doit en aucun cas correspondre au nom de l'exécutable. Mais si vous êtes sûr que le service ne figure pas dans la liste après l'installation, voici ce que vous pouvez faire.
Tout d'abord, l'installation du service. Il y a 2 méthodes, InstallUtil.exe
et SC.exe
. Le premier est spécialement conçu pour les services .NET car il exécutera tout le code ProjectInstaller
et ServiceInstaller
. La seconde ne le fera pas mais vous donnera plus d’options et est généralement plus efficace, c’est-à-dire qu’elle est susceptible de réussir lorsque InstallUtil
échoue. Cela peut arriver quand il y a une exception dans n'importe quel 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 vous donnez le service à ce stade et que cela peut être tout ce que vous voulez (dans des limites raisonnables :-). Ce nom sera affiché dans la liste de la console de services.
Une fois votre service installé, vous devez le déboguer correctement lorsque OnStart
est appelé. Cela peut être réalisé en exécutant et en joignant un débogueur (Visual Studio) à partir du service:
protected override void OnStart(string[] args)
{
#if DEBUG
Debugger.Launch();
#endif
...
}
N'oubliez pas de créer et de remplacer le service exécutable après ce changement de code. Le service doit être arrêté mais il n'est pas nécessaire de le désinstaller et de le réinstaller.
Pour supprimer le service à l'aide de SC
:
sc delete MyService
Je recommande d'ajouter /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 votre couche métier est distincte du service Windows, vous pouvez tester toutes vos fonctions métier en dehors de l'exécution du service Windows.
Pour tester le service Windows, j'aime créer un projet de test qui est une application console et je démarre 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 celui-ci 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 pour la configuration de la construction Debug.
<MTAThread()> _
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
Si vous créez votre service avec TopShelf, vous devriez pouvoir le déboguer facilement à partir de Visual Studio.