2010-12-14 5 views
1

J'ai écrit, installé et démarré avec succès un service Windows dans C# qui ne fait rien :) Au départ, je veux juste des trucs d'écho sur la console, db interroge le service, etc. J'ai utilisé le OnStart dans mon service, mais à partir d'une invite cmd lorsque je fais un net start "Mon service" où ces messages apparaissent?C# Windows Service Console.Writeln

Je suis ouvert à de meilleurs moyens. Je suis nouveau dans ce domaine et je le sens pas à pas en faisant écho à la console mes progrès. Devrais-je faire écho au journal des événements à la place? Comment puis-je faire? (Je sais, je sais, google)

protected override void OnStart(string[] args) 
    { 
     base.OnStart(args); 
     Console.WriteLine("Sham-Wow!"); 
    } 
+0

pourquoi ne pas le google? – bevacqua

+3

@Nico: Stackoverflow n'encourage pas "go go it it" et RTFM. Le site est destiné à répondre aux questions fréquentes. Ce qui me rappelle, y a-t-il un C# FAQ? –

+0

RTFM, je n'ai pas entendu ça. Quel acronyme génial. – rd42

Répondre

6

Vous ne pouvez pas écrire la console à partir d'un service Windows.

Je vous recommande d'utiliser n'importe quel utilitaire de journalisation, tel que log4net.

La seconde alternative est en train d'écrire à la Event Log (System.Diagnostics.EventLog)

+0

merci pour l'espace de noms aussi! – rd42

3

Si vous voulez exécuter votre application comme une application de la console (vous pouvez donc voir votre sortie de la console) ou en tant que service, vous pouvez y parvenir avec les éléments suivants :

  • Vérifiez que votre application est compilée en tant qu'application de console. Modifiez la méthode Main de l'application afin de pouvoir effectuer une dérivation pour l'exécution du service ou de la console.
  • Exécutez votre application comme suit pour obtenir une console "myservice.exe/console".

Cela fait des années que je l'ai fait pourrait donc besoin d'un peu de peaufinage, mais quelque chose comme suit:

static void Main(string[]] args) 
{ 
    if (args.Length == 0) 
    { 
      //Service entry 
      System.ServiceProcess.ServiceBase[] services; 
      services = new System.ServiceProcess.ServiceBase[] { new WinService1() }; 
      System.ServiceProcess.ServiceBase.Run(services); 
    } 
    else 
    { 
      //Console entry 
      OnStart(args); 
    } 
} 

protected override void OnStart(string[] args) 
{ 
    base.OnStart(args); 
    Console.WriteLine("Sham-Wow!"); 
} 

Ceci est très bien pour une première expérimentation, mais je recommande Log4Net une fois que vous avez votre tête autour des choses.

1

La manière la plus commune/acceptée de communiquer l'état de votre service consiste à écrire dans le journal des événements Windows. Pour faciliter le débogage, je vous recommande de placer tout votre code d'entreprise dans une classe distincte du composant de service. Vous pouvez ensuite utiliser cette classe à partir de votre service ou d'une application de console. Pendant la création du service, vous utiliserez l'application console pour héberger votre composant, ce qui vous permettra d'entrer facilement dans le code.