web-dev-qa-db-fra.com

Comment communiquer avec un service Windows?

Je souhaite créer un service Windows qui valide les données et y accéder à partir d'une autre application Windows, mais je suis novice dans les services et je ne sais pas comment démarrer. 

Ainsi, pendant que le service est en cours d'exécution, une application Windows doit se connecter au service, envoyer des données et obtenir une réponse, vraie ou fausse.

30
Alexandru Pupsa

Vérifiez la balise IPC (communications entre processus) sur StackOverflow . Il existe plusieurs moyens et technologies pour le faire: messages Windows, sockets, objets MMF et de synchronisation, canaux nommés, mailslots, etc. 

L'un des moyens les plus simples pour cette tâche particulière consiste à créer notre CBFS IPC , qui est fourni avec le code source. 

Je pourrais gérer avec succès le (presque) même problème que le vôtre en procédant comme suit:

Dans votre classe: ServiceBase, qui représente votre classe de service, vous pouvez avoir:

public Class () //constructor, to create your log repository
    {
      InitializeComponent();

      if (!System.Diagnostics.EventLog.SourceExists("YOURSource"))
      {
        System.Diagnostics.EventLog.CreateEventSource(
           "YOURSource", "YOURLog");
      }
      eventLog1.Source = "YOURSource";
      eventLog1.Log = "YOURLog";
    }

Maintenant, implémentez:

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

ET

protected override void OnStop()
{...}

Pour gérer les appels de commandes personnalisées:

protected override void OnCustomCommand(int command)
    {
      switch (command)
      {
        case 128:
          eventLog1.WriteEntry("Command " + command + " successfully called.");
          break;
        default:
          break;
      }
    }

Maintenant, utilisez ceci dans l'application où vous appelez le service Windows:

Enum pour référencer vos méthodes: (rappelez-vous, les méthodes personnalisées des Services reçoivent toujours un paramètre int32 (128 à 255) et en utilisant Enum, vous simplifiez la mémorisation et le contrôle de vos méthodes.

private enum YourMethods
  {
    methodX = 128
  };

Pour appeler une méthode spécifique:

ServiceController sc = new ServiceController("YOURServiceName", Environment.MachineName);
ServiceControllerPermission scp = new ServiceControllerPermission(ServiceControllerPermissionAccess.Control, Environment.MachineName, "YOURServiceName");//this will grant permission to access the Service
    scp.Assert();
    sc.Refresh();

    sc.ExecuteCommand((int)YourMethods.methodX);

En faisant cela, vous pouvez contrôler votre service.

Ici vous pouvez vérifier comment créer et installer un service Windows . Plus à propos de la méthode ExecuteCommand.

Bonne chance!

28
user2750836

Si vous utilisez .Net Framework 4, les fichiers mappés en mémoire constituent un moyen relativement simple d'implémenter une communication entre processus.

C’est assez simple, et bien décrit dans la documentation, et évite les surcoûts liés à l’utilisation de WCF ou d’autres interactions basées sur la connexion/communication à distance, ou l’écriture de données partagées dans un emplacement central et la scrutation (base de données). , fichier, etc).

Voir ici pour un aperçu.

4
Rob Levine

Vous pouvez y parvenir très facilement en faisant du service Héberger un service WCF et en vous y connectant depuis votre application.

3
poindexter12

Nous utilisons des tubes nommés à cette fin. Mais notre client implémenté avec C++. Si votre service et votre application sont implémentés dans .Net, vous pouvez utiliser .Net Remoting.

2
DReJ

Dans les anciennes versions de Windows, vous pouvez configurer votre service Windows pour qu'il interagisse avec le bureau. Cela vous a permis d'ajouter des éléments d'interface utilisateur directement à votre service, qui pourraient être présentés à l'utilisateur. À partir de Windows Vista, les services ne peuvent plus interagir directement avec les utilisateurs, c’est-à-dire sans interface utilisateur.

Pour ce faire, vous souhaitez écrire votre service Windows et dans une application Windows frontale. Pour créer un pont de communication entre les deux, il est vivement recommandé d'utiliser Windows Communication Foundation (WCF).

Pour créer un service Windows C #, vous pouvez suivre les instructions pas à pas ici .

1
Matt Davis

Pendant le traitement, votre service peut ajouter des événements au journal des événements. 

Vous pouvez créer une autre application console fonctionnant en parallèle avec le service et écoutant cet EventLog avec le mécanisme de gestion des événements:

var log= new EventLog("[name of the eventlog]");
log.EnableRaisingEvents = true;
log.EntryWritten += Log_EntryWritten;

Ensuite, vous vous en occupez immédiatement: 

private static void Log_EntryWritten(object sender, System.Diagnostics.EntryWrittenEventArgs e)
{
    Console.WriteLine("Event detected !");
}

Vous pouvez lire l'objet EntryWrittenEventArgs pour obtenir tous les détails de l'événement et afficher ce que vous voulez dans votre application de console. Si vous arrêtez l'application de la console, le service continue de s'exécuter et reste connecté au journal des événements.

0
Allie

Pensez-y en tant que propriétaire d'une base de données distante. Supposons que vous ayez 1 base de données pour 10 applications nécessitant des données différentes de la base de données et que vous ne voulez pas ouvrir toutes vos données dans chacune des applications. De plus, vos applications seront indépendantes de votre base de données, votre couche de données mis en œuvre dans votre service, vos applications ne conserveront pas cette logique. Vous pouvez écrire un service et ouvrir votre service à vos autres applications. 

Comment écrire votre premier service Windows peut vous aider.

0
Pabuc