2009-01-19 10 views
3

J'ai une application C++ avec des données qui doivent être partagées avec une application C#. Je suis en train de transférer les données via des fichiers, mais avec la vitesse et la quantité de données devenant un problème, je voudrais trouver un moyen de partager les données par la mémoire.Comment partager des données entre une application C++ et une application C# sans fichiers?

Je suis un débutant à programmeur intermédiaire au mieux, et jusqu'à présent j'ai entendu parler de deux méthodes qui peuvent être en mesure de me aider: Socket Programmation & mémoire mappée Fichiers

Alors mes questions est, qui est le meilleur moyen de le faire? (oui, la vitesse est un facteur)

et toute information ou des liens vers des informations qui pourraient m'aider dans ma recherche et la compréhension de la méthode que vous suggérez serait très appréciée.

Merci,

+0

-ce que ces applications toujours sur la même machine, ou peuvent-ils être en cours d'exécution sur des machines distinctes? –

+0

Toujours sur la même machine. – timmyg

Répondre

7

Vous pouvez utiliser named pipes pour la communication interprocessus. Je ne l'ai pas utilisé de C++ terres encore bien ..

+0

En ce qui concerne C#, je devine que vous développez probablement sur Windows. Si oui, alors pour commencer à la fois en C++ et C#/pinvoke, voir http://msdn.microsoft.com/en-us/library/aa365590.aspx – Aaron

5

Sockets, l'OMI. C'est standard, rapide (encore plus si vous courez dans la même machine) et très flexible. Fichiers mappés en mémoire Je ne suis pas sûr si elle est supportée par C# mais je peux me tromper.

+0

mise à jour: pris en charge depuis .net 4 https://docs.microsoft .com/fr-fr/dotnet/standard/io/fichiers mappés en mémoire – YoniXw

3

Ceci est une question assez difficile, surtout parce qu'il n'y a pas de bonne réponse. Vous pouvez certainement utiliser des sockets ou des fichiers mappés en mémoire pour communiquer entre deux processus. D'autres alternatives sont COM ou simplement poster un message Windows d'un processus à un autre.

0

Je suggérerais probablement googling communication interprocessus pour ce faire. Chaque système d'exploitation a une méthode différente, mais vous devez essentiellement signaler une application de l'autre (avec le signal codant les données et les types de données). L'utilisation de sockets est une bonne méthode, mais a le problème que si l'adresse de bouclage de la machine est kaput (ce qui peut facilement être fait par mauvaise configuration en jouant avec des trucs ip) alors votre application ne pourra pas communiquer. Sur une note plus sérieuse, si l'adresse de bouclage est compromise et faite pour pointer sur une machine attaquante, votre application envoie soudainement des données à une source malveillante, bien que cela puisse ou non être un problème pour vous.

0

Les fichiers mappés en mémoire ne sont pas disponibles en natif en C#, mais vous pouvez probablement faire quelque chose en utilisant P/Invoke.

2

Erm. Je suggérerais une approche différente. Je crois que vous trouverez beaucoup plus facile de faire un objet (ou des objets) dans C++ géré. Vous pouvez conserver tout le contenu de votre projet C++ natif, à l'exception de ce fichier/classe que vous compilerez avec/clr.

La classe/clr sera capable d'interopérer trivialement avec .net, puisqu'il s'agit de .net. Ensuite, vous pouvez ajouter des méthodes C++ régulières à l'objet pour obtenir des données dedans et dehors comme bon vous semble. En règle générale, je suggère de copier les données à travers la limite de sorte que vous n'avez pas besoin de visser avec épinglage ou quoi que ce soit.

Il faut un peu de temps pour s'y habituer, mais cette approche est très flexible.

Voici un petit quelque chose qui parle mieux que moi: http://blogs.microsoft.co.il/blogs/sasha/archive/2008/02/16/net-to-c-bridge.aspx

Questions connexes