J'ai une application console et je souhaite l'exécuter en tant que service Windows. VS2010 a un modèle de projet qui permet d'attacher un projet de console et de créer un service Windows. Je voudrais ne pas ajouter de projet de service séparé et si possible intégrer le code de service dans l'application console pour conserver l'application console en tant que projet unique qui pourrait fonctionner en tant qu'application console ou en tant que service Windows si elle est exécutée par exemple à partir de la ligne de commande à l'aide de commutateurs.
Peut-être que quelqu'un pourrait suggérer une bibliothèque de classes ou un extrait de code qui pourrait rapidement et facilement transformer une application console c # en service?
Réponses:
J'utilise généralement la technologie suivante pour exécuter la même application en tant qu'application console ou en tant que service:
Environment.UserInteractive
est normalement vrai pour l'application console et faux pour un service. Techniquement, il est possible d'exécuter un service en mode interactif avec l'utilisateur, vous pouvez donc vérifier un commutateur de ligne de commande à la place.la source
J'ai eu beaucoup de succès avec TopShelf .
TopShelf est un package Nuget conçu pour faciliter la création d'applications Windows .NET pouvant s'exécuter en tant qu'applications console ou services Windows. Vous pouvez connecter rapidement des événements tels que les événements de démarrage et d'arrêt de votre service, configurer à l'aide du code, par exemple pour définir le compte sous lequel il s'exécute, configurer les dépendances sur d'autres services et configurer la manière dont il récupère les erreurs.
Depuis la console du gestionnaire de packages (Nuget):
Reportez-vous aux exemples de code pour commencer.
Exemple:
TopShelf s'occupe également de l'installation du service, ce qui peut gagner beaucoup de temps et supprime le code standard de votre solution. Pour installer votre .exe en tant que service, exécutez simplement ce qui suit à partir de l'invite de commande:
Vous n'avez pas besoin de connecter un ServiceInstaller et tout cela - TopShelf fait tout pour vous.
la source
Voici donc la procédure pas à pas complète:
* InstallUtil.exe se trouve généralement ici: C: \ windows \ Microsoft.NET \ Framework \ v4.0.30319 \ InstallUtil.ex e
Program.cs
MyService.cs
MyServiceInstaller.cs
la source
J'entends votre point de vouloir qu'un assemblage arrête le code répété, mais ce serait plus simple et réduire la répétition du code et faciliter la réutilisation de votre code d'une autre manière à l'avenir si ...... vous le divisez en 3 assemblys.
la source
Start()
et desStop()
méthodes et l'application console a une boucle. À moins d'utiliser un framework comme TopShelf , c'est la meilleure optionVoici une nouvelle façon de transformer une application console en service Windows en tant que service de travail basé sur le dernier .Net Core 3.1 .
Si vous créez un service de travail à partir de Visual Studio 2019, il vous donnera presque tout ce dont vous avez besoin pour créer un service Windows prêt à l'emploi, ce qui est également ce que vous devez modifier dans l'application console afin de le convertir en service Windows.
Voici les changements que vous devez faire:
Installez les packages NuGet suivants
Changez Program.cs pour avoir une implémentation comme ci-dessous:
et ajoutez Worker.cs où vous mettrez le code qui sera exécuté par les opérations de service:
Lorsque tout est prêt et que l'application a été créée avec succès, vous pouvez utiliser sc.exe pour installer votre exe d'application console en tant que service Windows avec la commande suivante:
la source
Vous pouvez utiliser
Et il apparaîtra dans la liste des services. Je ne sais pas si cela fonctionne correctement. Un service doit généralement écouter plusieurs événements.
Il existe cependant plusieurs wrapper de service qui peuvent exécuter n'importe quelle application en tant que service réel. Par exemple Microsofts SrvAny du Kit de ressources Win2003
la source
Tout d'abord, j'intègre la solution d'application console dans la solution de service Windows et je la référence.
Ensuite, je rends la classe de programme de l'application console publique
Je crée ensuite deux fonctions au sein de l'application console
Ensuite, dans le service Windows lui-même, j'instancie le programme et j'appelle les fonctions de démarrage et d'arrêt ajoutées dans OnStart et OnStop. Voir ci-dessous
Cette approche peut également être utilisée pour un hybride application Windows / service Windows
la source
Vous devriez peut-être définir ce dont vous avez besoin, pour autant que je sache, vous ne pouvez pas exécuter votre application en tant que console ou service avec ligne de commande, en même temps. N'oubliez pas que le service est installé et que vous devez le démarrer dans le Gestionnaire de services, vous pouvez créer une nouvelle application qui démarre le service ou démarre un nouveau processus exécutant votre application console. Mais comme tu l'écris
Une fois, j'étais à votre place, transformant une application console en service. Vous avez d'abord besoin du modèle, au cas où vous travaillez avec VS Express Edition. Voici un lien où vous pouvez avoir vos premiers pas: Service C # Windows , cela m'a été très utile. Ensuite, à l'aide de ce modèle, ajoutez votre code aux événements souhaités du service.
Pour améliorer votre service, il y a une autre chose que vous pouvez faire, mais ce n'est pas rapide et / ou facile, consiste à utiliser des domaines d'application et à créer des dll pour charger / décharger. Dans l'un, vous pouvez démarrer un nouveau processus avec l'application console, et dans un autre dll, vous pouvez simplement mettre la fonctionnalité que le service doit faire.
Bonne chance.
la source
Vous devez séparer la fonctionnalité en une ou plusieurs classes et la lancer via l'un des deux stubs. Le stub de console ou le stub de service.
Comme il est évident, lors de l'exécution de Windows, la myriade de services qui composent l'infrastructure ne présente pas (et ne peut pas directement) présenter les fenêtres de console à l'utilisateur. Le service doit communiquer avec l'utilisateur de manière non graphique: via le SCM; dans le journal des événements, vers un fichier journal, etc. Le service devra également communiquer avec Windows via le SCM, sinon il sera arrêté.
Il serait évidemment acceptable d'avoir une application console capable de communiquer avec le service, mais le service doit fonctionner indépendamment sans nécessiter d'interaction GUI.
Le stub de la console peut être très utile pour déboguer le comportement du service, mais ne doit pas être utilisé dans un environnement "production" qui, après tout, est le but de la création d'un service.
Je ne l'ai pas lu complètement mais cet article semble aller dans la bonne direction.
la source
J'utilise une classe de service qui suit le modèle standard prescrit par
ServiceBase
, et j'utilise des helpers pour faciliter le débogage F5. Cela permet de garder les données de service définies dans le service, ce qui les rend faciles à trouver et leur durée de vie facile à gérer.Je crée normalement une application Windows avec la structure ci-dessous. Je ne crée pas d'application console; de cette façon, je n'ai pas une grosse boîte noire qui me saute au visage chaque fois que je lance l'application. Je reste dans le débogueur où se trouve toute l'action. j'utilise
Debug.WriteLine
pour que les messages soient dirigés vers la fenêtre de sortie, qui s'ancre bien et reste visible après la fin de l'application.Je ne prends généralement pas la peine d'ajouter du code de débogage pour m'arrêter; J'utilise simplement le débogueur à la place. Si j'ai besoin de déboguer l'arrêt, je fais du projet une application console, j'ajoute une
Stop
méthode de transfert et je l'appelle après un appel àConsole.ReadKey
.la source