2010-09-21 5 views
3

Puis-je faire en sorte qu'une application VB6 appelle une connexion de canal nommé à un service écrit en C# avec un point de terminaison WCF?Canaux nommés de VB6 à WCF

Projet VB6 qui utilise des canaux nommés pour communiquer avec un service écrit en C++. Je voudrais convertir le service C++ en C# (.NET 4.0 de préférence).

Le projet VB6 utilise un appel Win32 au CallNamedPipes pour envoyer un message au serveur. La charge utile du message est une chaîne constituée de la structure suivante.

[command][data length][data if approprate to the message] 

Je ne suis pas en mesure de convertir le côté VB6 de l'application à ce moment, mais je me demande si je peux compter sur la fonction CallNamedPipe d'envoyer un message à un nouveau service de WCF et s'ils vont bien jouer ensemble . Je verrais le côté contractuel du service WCF essentiellement comme une méthode qui accepte une chaîne que je vais analyser.

De plus, étant donné que CallNamedPipes peut recevoir des données de retour dans le paramètre outputBuffer, WCF pourrait-il accepter cela? Serait le contrat quelque chose comme ça ...

string DoSomething(string command) 

Merci pour votre aide!

Brian

Répondre

1

WCF est très bon, mais brille vraiment lorsque vous utilisez WCF des deux côtés du canal de communication. Essayer de connecter du code hérité à un service WCF est au mieux délicat.

Il sera probablement plus facile de faire en sorte que votre service C# utilise directement NamedPipeServerStream. Cela vous donnera un contrôle complet sur la manière dont la connexion et le transfert sont gérés. Cela étant dit, rien ne vous empêche de faire les deux (implémentation d'un canal personnalisé NamedPipeServerStream, ainsi que l'exposition d'un ou de plusieurs points de terminaison WCF, à partir du même programme). Cela fournirait un moyen d'aller de l'avant si vous voulez mettre à jour le client.

+0

Avec un NamedPipeServerStream, puis-je renvoyer des données de retour ou est-ce que je ferais fondamentalement un type de communication bidirectionnelle sur le canal afin que le client ait besoin «d'écouter» les données de retour? J'aimerais mettre à jour le client, mais pour l'instant ce n'est pas dans sa portée et je ne sais pas si c'est le cas. –

+0

@Brian: Vous feriez simplement tout ce que votre programme C++ est en train de faire - il est possible de faire une communication bidirectionnelle dans un seul canal - mais je ne suis pas sûr de ce que votre programme actuel attend. –

+0

actuellement les appels de code VB6 avec une commande comme "GiveMeSomeInfo" au service, qui renvoie l'information dans le buffer de sortie fourni par CallNamedPipe. Donc, vraiment, il est utilisé comme un appel de méthode à distance.Comme vous le dites, je pourrais faire exactement ce que fait le code C++ et PInvoquer le code Win32 pour installer le canal nommé et retourner les données. J'espérais faire fonctionner la WCF. –

0

Brian,

Pouvez-vous appeler le C++ appelé application Pipes directement à partir de votre code C# en utilisant PInvoke

Pinvoke.net

Ensuite, l'enveloppe le service PInvoke autour d'un service WCF pour Interop facile.

Cordialement

Iain

+0

Je veux appeler de VB6 à une nouvelle application C#. Le but est de se débarrasser du code C++. –

0

Pourquoi ne pas écrire une classe ComVisible enroulant un proxy côté client WCF, que votre code VB6 pourrait appeler comme tout autre composant de la bibliothèque COM.

Questions connexes