Question

Je n'ai jamais eu à faire de l'IPC sous Windows auparavant.Actuellement, je développe une paire de programmes, une application GUI/CLI standard et un service Windows.L'application doit indiquer au service quoi faire.Alors, en supposant que la communication soit locale uniquement, quelle serait la meilleure méthode de communication pour ces deux processus ?

Où le meilleur est défini comme plus robuste et moins sujet aux erreurs, pas le plus performant ni le plus facile à coder.

Des exemples de code seront les bienvenus, mais ne sont pas obligatoires :-)

Remarque Je demande quoi utiliser, un socket TCP standard, des canaux nommés ou tout autre moyen de communication uniquement.

Merci!

Était-ce utile?

La solution

L'IPC dans .Net peut être obtenu en utilisant :

WCF

en utilisant des canaux nommés nécessite .Net 3.0 et ci-dessus.

Exemple de code


À distance

Le framework IPC original publié avec .Net 1.0.Je pense que l'accès à distance n'est plus activement développé et vous êtes encouragé à utiliser WCF à la place.

Exemple de code

Communication inter-processus via Remoting - utilise un canal TCP

Ressources


Win32 RPC utilisant csharptest-net RpcLibrary

Je suis récemment tombé sur un projet qui a enveloppé la bibliothèque RPC Win32 et créé une bibliothèque de classes .net qui peut être utilisée pour le RPC local et distant.

Page d'accueil du projet: http://csharptest.net/projects/rpclibrary/

Références MSDN :

Dispose également d'un client RPC de tampons de protocole Google qui s'exécute au-dessus de la bibliothèque : https://code.google.com/p/protobuf-csharp-rpc/


WM_COPYDATA

Pour être complet il est également possible d'utiliser la méthode WIN32 avec le WM_COPYDATA message.J'ai déjà utilisé cette méthode dans .Net 1.1 pour créer une application à instance unique ouvrant plusieurs fichiers à partir de l'Explorateur Windows.

Ressources

Prises

Utiliser un protocole personnalisé (plus difficile)

Autres conseils

Pour le local uniquement, nous avons réussi à utiliser les canaux nommés.Évite la surcharge de TCP et est à peu près (du moins pour .NET) aussi efficace que possible tout en disposant d'une API décente avec laquelle travailler.

Puisque vous êtes limité à .Net 2.0, WCF n'est peut-être pas une option.Vous pouvez utiliser l'accès à distance .Net avec mémoire partagée comme mécanisme de communication sous-jacent entre les domaines d'application sur la même machine.En utilisant cette approche, vous pouvez facilement placer vos processus sur différentes machines et remplacer le protocole de mémoire partagée par un protocole réseau.

La méthode standard de communication avec un service Windows consiste à utiliser des codes de contrôle de service.Les services Windows peuvent recevoir des codes de 0 à 255.0-127 est réservé au système.128 à 255 peuvent être utilisés pour les commandes personnalisées.

Si vous devez envoyer des objets complexes au service, utilisez la base de données, XML, fichier, TCP, http, etc.En dehors de cela pour l'envoi de commandes de contrôle telles que la configuration de rechargement, les éléments de processus, etc., ces codes de contrôle doivent être utilisés.

Des fonctionnalités supplémentaires sont disponibles, telles que l'interrogation du service.Consultez la documentation du service Windows et l’API.

http://arcanecode.com/2007/05/30/windows-services-in-c-sending-commands-to-your-windows-service-part-7/

Votre meilleur pari est d’utiliser WCF.Vous pourrez créer un hôte de service dans le service Windows et exposer une interface bien définie que l'application GUI peut consommer.WCF vous permettra de communiquer via des canaux nommés si vous le souhaitez, ou vous pouvez choisir n'importe quel autre protocole de communication comme TCP, HTTP, etc.En utilisant WCF, vous bénéficiez d’un excellent support d’outils et de nombreuses informations disponibles.

J'aimerais ajouter à cette discussion.S'il vous plaît, réprimandez-moi si c'est exagéré - mais un sémaphore (ou plusieurs sémaphores) ne pourrait-il pas être utilisé pour une communication rudimentaire ?

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