154 votes

.NET application console en tant que service Windows

J'ai l'application de la console et souhaitez l'exécuter en tant que service Windows. VS2010 a un modèle de projet qui permettent d'attacher la console de projet et créer un service Windows. Je voudrais ne pas ajouter séparés projet de service et, si possible, intégrer le code de service dans l'application de la console de garder l'application de la console comme un projet qui pourrait exécuter en tant qu'application console ou en tant que service windows si exécuté, par exemple, à partir de la ligne de commande à l'aide de commutateurs.

Peut-être que quelqu'un pourrait proposer la bibliothèque de la classe ou de l'extrait de code qui pourrait rapidement et facilement transformer application console c#?

203voto

VladV Points 5071

J'utilise habituellement le suivant techinque pour exécuter la même application comme une application console ou en tant que service:

public static class Program
{
    #region Nested classes to support running as service
    public const string ServiceName = "MyService";

    public class Service : ServiceBase
    {
        public Service()
        {
            ServiceName = ServiceName;
        }

        protected override void OnStart(string[] args)
        {
            Program.Start(args);
        }

        protected override void OnStop()
        {
            Program.Stop();
        }
    }
    #endregion

    static void Main(string[] args)
    {
        if (!Environment.UserInteractive)
            // running as service
            using (var service = new Service())
                ServiceBase.Run(service);
        else
        {
            // running as console app
            Start(args);

            Console.WriteLine("Press any key to stop...");
            Console.ReadKey(true);

            Stop();
        }
    }

    private static void Start(string[] args)
    {
        // onstart code here
    }

    private static void Stop()
    {
        // onstop code here
    }
}

De l'environnement.UserInteractive est normalement vrai pour console application et faux pour un service.
Techically, il est possible d'exécuter un service à l'utilisateur en mode interactif, de sorte que vous pouvez vérifier un commutateur de ligne de commande à la place.

62voto

saille Points 3585

J'ai eu beaucoup de succès avec TopShelf.

TopShelf est un package Nuget conçu pour le rendre facile à créer .NET applications Windows qui peut fonctionner comme la console d'applications ou de Services Windows. Vous pouvez rapidement raccorder des événements tels que votre service de Démarrer et d'Arrêter des événements, configurer à l'aide de code par exemple, pour régler le compte de qui elle s'exécute, configurer des dépendances sur d'autres services, et de configurer la façon dont il récupère les erreurs.

À partir du Gestionnaire de paquets de la Console Nuget):

Install-Package Topshelf

Reportez-vous aux exemples de code pour commencer.

Exemple:

HostFactory.Run(x =>                                 
{
    x.Service<TownCrier>(s =>                        
    {
       s.ConstructUsing(name=> new TownCrier());     
       s.WhenStarted(tc => tc.Start());              
       s.WhenStopped(tc => tc.Stop());               
    });
    x.RunAsLocalSystem();                            

    x.SetDescription("Sample Topshelf Host");        
    x.SetDisplayName("Stuff");                       
    x.SetServiceName("stuff");                       
}); 

3voto

JonAlb Points 1346

J'entends votre point de vouloir un assemblage à l'arrêt de code à répétition mais, Il serait plus simple et de réduire la répétition de code et de le rendre plus facile à réutiliser votre code dans d'autres façons à l'avenir si...... vous de le casser en 3 sous-ensembles.

  1. Une bibliothèque de l'assemblée qui fait tout le travail. Alors les deux très très mince/projets simples:
  2. l'une qui est la ligne de commande
  3. celui qui est le service windows.

2voto

Darcara Points 1110

Vous pouvez utiliser

reg add HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run /v ServiceName /d "c:\path\to\service\file\exe"

Et il semble int de la liste de service. Je ne sais pas, si cela fonctionne correctement. Un service est généralement écouter plusieurs événements.

Il y a plusieurs service wrapper cependant, que peut exécuter n'importe quelle application comme un service réel. Par Exemple, les directives de Microsoft SrvAny de la Win2003 Kit de Ressources

0voto

BlackCath Points 284

Peut-être que vous devez définir ce que vous avez besoin, autant que je sache, vous ne pouvez pas exécuter votre application en tant que Console ou d'un Service en ligne de commande, dans le même temps. Rappelez-vous que le service est installé et vous devez démarrer dans le Gestionnaire des Services, vous pouvez créer une nouvelle application qui démarre le service ou démarre un nouveau processus de l'exécution de votre application console. Mais comme vous l'avez écrit

"garder l'application de la console comme un projet"

Une fois, j'étais dans votre position, en tournant une application console dans un service. Tout d'abord vous devez le modèle, dans le cas où vous travaillez avec VS Express Edition. Voici un lien où vous pourrez faire vos premiers pas: C# Service Windows, cela a été très utile pour moi. Ensuite, à l'aide de ce modèle, ajouter votre code pour les événements souhaités du service.

Pour améliorer le service, il y a une autre chose que vous pouvez faire, mais ce n'est pas rapide et/ou plus facilement, à l'aide de domaines d'application, et la création de dll pour charger/décharger. Dans l'un vous pouvez démarrer un nouveau processus avec l'application de console, et dans une autre dll, vous pouvez simplement mettre la fonctionnalité, le service a à faire.

Bonne chance.

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