web-dev-qa-db-fra.com

Comment envoyer une commande personnalisée à un service Windows .NET à partir du code .NET?

Comme dans le lien suivant, on peut arrêter, démarrer et "arrêter, puis démarrer" un service en utilisant le code C #.

http://www.csharp-examples.net/restart-windows-service/

J'ai créé un service .NET qui implémente OnStart et OnStop. Cependant, j'ai besoin d'implémenter une fonctionnalité de "redémarrage intelligent" qui est plus complexe que l'arrêt et le démarrage. Je dois garder le temps d'arrêt à quelques secondes si cela (mais Stop + Start peut prendre des minutes dans ce cas lorsqu'il est fait proprement, et je dois le faire proprement), et avoir certaines parties du système disponibles pendant que d'autres redémarrent/rafraîchissent .

Pour faire court - avant de commencer à implémenter cette fonctionnalité OnSmartRestart, je veux m'assurer qu'il existe un moyen assez simple d'appeler cet appel à partir d'une autre application C #.

Cette fonctionnalité est importante, mais dangereuse. Je veux le rendre assez caché, quelque peu sécurisé, le garder aussi simple et m'assurer que cela a un effet négligeable sur les performances de mon service Windows pendant qu'il effectue ses tâches régulières et ne redémarre pas.

Si je dois interroger un fichier ou ouvrir un port et dépenser trop de CPU pour cela, ce ne serait pas une bonne solution. Je veux aussi garder cela aussi simple que possible (désolé pour la répétition).

37
Hamish Grubijan

Vous pouvez envoyer des "commandes" à un service en utilisant ServiceController.ExecuteCommand :

const int SmartRestart = 222;

var service = new System.ServiceProcess.ServiceController("MyService");
service.ExecuteCommand(SmartRestart);
service.WaitForStatus(ServiceControllerStatus.Running, timeout);

Vous devrez ajouter une référence à l'assembly System.ServiceProcess.dll.

Le service peut réagir à la commande en remplaçant ServiceBase.OnCustomCommand :

protected override void OnCustomCommand(int command)
{
    if (command == SmartRestart)
    {
        // ...
    }
}
59
dtb

Les moyens habituels de communication avec les processus externes dans les fenêtres sont:

  1. Tuyaux nommés
  2. Douilles
  3. GetObject de COM pour obtenir une référence à un objet, puis appeler ses méthodes sur l'interface exposée.

Les deux premiers ont été présentés comme WCF, c'est donc la voie à suivre. Le troisième ne semble pas pertinent pour votre situation et est ancien.

Si vous devez exécuter vos commandes à partir de la même machine, vous pouvez utiliser des tuyaux nommés, mais le durcissement a rendu la tâche très difficile et gênante. Sinon, utilisez la liaison nommée WCF TCP.

15
Aliostad