Question

Quelle est la meilleure méthode en C # pour configurer une application utilitaire pouvant être exécutée à partir de la ligne de commande et produire une sortie (ou écrire dans un fichier), mais pouvant également être exécutée en tant que service Windows pour effectuer son travail en arrière-plan (par exemple, surveillance d'un répertoire, ou autre).

J'aimerais écrire le code une fois et pouvoir l'appeler de manière interactive à partir de PowerShell ou d'un autre CLI, mais en même temps, trouver un moyen d'installer le même fichier EXE en tant que service Windows et de le laisser fonctionner sans surveillance. .

Puis-je faire cela? Et si oui: comment puis-je faire cela?

Était-ce utile?

La solution

Oui, vous le pouvez.

Une solution consiste à utiliser un paramètre de ligne de commande, par exemple "/ console", pour distinguer la version de la console de l'exécution en tant que version de service:

  • créez une application console Windows, puis
  • dans Program.cs, plus précisément dans la fonction Main, vous pouvez tester la présence de l'option "/ console". param
  • si le " / console " est là, démarrez le programme normalement
  • si le paramètre n'y est pas, appelez votre classe de service depuis une base de service


// Class that represents the Service version of your app
public class serviceSample : ServiceBase
{
    protected override void OnStart(string[] args)
    {
        // Run the service version here 
        //  NOTE: If you're task is long running as is with most 
        //  services you should be invoking it on Worker Thread 
        //  !!! don't take too long in this function !!!
        base.OnStart(args);
    }
    protected override void OnStop()
    {
        // stop service code goes here
        base.OnStop();
    }
}

...

Puis dans Program.cs:


static class Program
{
    // The main entry point for the application.
    static void Main(string[] args)
    {
        ServiceBase[] ServicesToRun;

    if ((args.Length > 0) && (args[0] == "/console"))
    {
        // Run the console version here
    }
    else
    {
        ServicesToRun = new ServiceBase[] { new serviceSample () };
        ServiceBase.Run(ServicesToRun);
    }
}

}

Autres conseils

Le meilleur moyen de le faire, du point de vue de la conception, consiste à implémenter toutes vos fonctionnalités dans un projet de bibliothèque et à construire des projets wrapper distincts autour de celui-ci pour que celui-ci s'exécute comme vous le souhaitez (par exemple, un service Windows, un programme de ligne de commande, un asp. service Web net, un service wcf, etc.)

Oui, cela peut être fait.

Votre classe de démarrage doit étendre ServiceBase.

Vous pouvez utiliser votre méthode de démarrage principale void statique (string [] args) pour analyser un commutateur de ligne de commande à exécuter en mode console.

Quelque chose comme:

static void Main(string[] args)
{
   if ( args == "blah") 
   {
      MyService();
   } 
   else 
   {
      System.ServiceProcess.ServiceBase[] ServicesToRun;
      ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyService() };
      System.ServiceProcess.ServiceBase.Run(ServicesToRun);
   }

Un service Windows est assez différent d’un programme Windows normal; il vaut mieux ne pas essayer de faire deux choses à la fois.

Avez-vous envisagé d'en faire une tâche planifiée à la place?

service Windows vs tâche planifiée

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top