53 votes

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

Je n'ai jamais eu à faire d'IPC sur Windows auparavant. Je développe une paire de programmes, une application GUI/CLI standard et un service Windows. L'application doit dire au service ce qu'il doit faire. En supposant que la communication soit uniquement locale, quelle serait la meilleure méthode de communication pour ces deux processus ?
Par "meilleure", j'entends plus robuste et moins sujette aux erreurs, pas la meilleure performance ni la plus facile à coder.

Notez que je demande ce qu'il faut utiliser, un socket TCP standard, des pipes nommés, ou un autre moyen de communication seulement.

73voto

Edward Wilde Points 5808

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

WCF

utiliser des tuyaux nommés nécessite .Net 3.0 et plus.

Exemple de code


Remoting

Le cadre IPC original est sorti avec .Net 1.0. Je crois que le remoting n'est plus activement développé et que vous êtes encouragés à utiliser WCF à la place.

Exemple de code

Communication interprocessus 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 classe .net qui peut être utilisée pour les RPC locaux et distants.

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

Références MSDN :

Il y a également un client rpc de tampons de protocole google qui fonctionne 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 l'option 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 depuis l'explorateur Windows.

Ressources

Douilles

Utilisation d'un protocole personnalisé (plus difficile)

7voto

Guy Starbuck Points 14241

Pour le local uniquement, nous avons réussi à utiliser les Named Pipes. Ils évitent l'overhead de TCP et sont à peu près (du moins pour .NET) aussi efficaces que possible tout en ayant une API décente pour travailler.

2voto

Brian Ensink Points 7579

Puisque vous êtes limité à .Net 2.0, WCF n'est peut-être pas une option. Vous pourriez utiliser .Net remoting avec la 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.

2voto

Shafqat Ahmed Points 1103

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 base de données, xml, fichier, tcp, http, etc. En outre, pour envoyer des commandes de contrôle comme le rechargement de la configuration, les éléments de traitement, etc., ces codes de contrôle doivent être utilisés.

Des fonctionnalités supplémentaires sont disponibles, comme l'interrogation du service. Voir la documentation et l'api du service Windows.

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

1voto

Tono Nam Points 4465

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X