Communication interprocessus pour Windows en C # (.NET 2.0)

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

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

Les exemples de code seront les bienvenus, mais ne sont pas obligatoires 🙂

Remarque Je vous demande ce que vous devez utiliser, un socket TCP standard, des canaux nommés ou d’autres moyens de communication uniquement.

Merci!

IPC dans .Net peut être réalisé en utilisant:

WCF

L’utilisation de canaux nommés nécessite .Net 3.0 et supérieur.

Exemple de code


À distance

Le cadre IPC original publié avec .Net 1.0. Je crois que le remoting 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

  • GenuineChannels vend une boîte à outils à distance comprenant un canal de mémoire partagée. http://www.genuinechannels.com/Index.aspx
  • Ingo Rammer , a écrit le livre à distance définitif .Net, Advanced .NET Remoting, deuxième édition

Win32 RPC utilisant csharptest-net RpcLibrary

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

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

Références MSDN:

A également 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 message WM_COPYDATA . 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

  • MSDN – WM_COPYDATA
  • Exemple de code
  • Déclaration PInvoke.net

Douilles

Utiliser un protocole personnalisé (plus dur)

Pour le local seulement, nous avons eu du succès en utilisant des tubes nommés. Évite la surcharge de TCP, et est à peu près (au moins pour .NET) aussi efficace que possible, tout en ayant une API décente pour travailler.

Puisque vous êtes limité à .Net 2.0, WCF n’est peut-être pas une option. Vous pouvez utiliser .Net Remoting avec la mémoire partagée comme mécanisme de communication sous-jacent entre les domaines d’application de la même machine. Grâce à 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 objects complexes au service, utilisez la firebase database, xml, file, tcp, http etc. En dehors de cela pour envoyer des commandes telles que la configuration de rechargement, les éléments de processus, etc.

Des fonctionnalités supplémentaires sont disponibles, telles que l’interrogation du service. Voir la documentation du service Windows et 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 pouvant être utilisée par l’application graphique. 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 tel que TCP, HTTP, etc.

J’aimerais append à cette discussion. S’il vous plait, réprimande-moi si c’est là-bas – mais un sémaphore (ou plusieurs sémaphores) ne pourrait-il pas être utilisé pour une communication rudimentaire?