Communication interprocessus pour Windows en C# (.NET 2.0)
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!
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
- La classe WCF NetNamedPipeBinding peut être utilisé pour la communication interprocessus sur la même machine.La documentation MSDN pour cette classe comprend un exemple de code couvrant ce scénario http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding.aspx
À 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
- GenuineChannels, vend une boîte à outils de communication à distance qui comprend un canal de mémoire partagée. http://www.genuinechannels.com/Index.aspx
- Ingo Rammer, a écrit le livre définitif sur la communication à distance .Net, Advanced .NET Remoting, deuxième édition
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 :
- Comment fonctionne RPC : http://technet.microsoft.com/en-us/library/cc738291(v=ws.10).aspx
- Fonctions RPC : http://msdn.microsoft.com/en-us/library/aa378623(v=VS.85).aspx
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.
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 ?