2015-09-02 3 views
-1

Je souhaite partager une integer array, d'une taille fixe, en face d'un Windows Service à C#, à un code écrit en unmanaged C++. Ce sera à travers 2 processus, le Windows Service en C#, à un autre processus en C++.Partager tableau entier à travers la mémoire partagée de Managed au code non managé

Cette transaction doit être effectuée une fois, et il ne s'agit pas d'un grand tableau, mais simplement d'un transfert dans la mémoire partagée entre les deux.

Quel serait le moyen le plus efficace pour y parvenir? Peut-être avec memory mapped files, mais je ne suis pas certain comment les données seront transmises.

EDIT -

Je ne veux pas utiliser un emballage CLI ou P/INVOKE (puisque je comprends qu'il est temps cher).

Je vais aller de l'avant avec le mappage de la mémoire, mais je ne suis pas sûr comment les données doivent être marshalled et unmarshalled entre les deux.

+1

Pourquoi ne pas [utiliser P/Invoke pour passer le tableau à la fonction non managée] (https://msdn.microsoft.com/en-us/library/hk9wyw21%28v=vs.110%29.aspx)? –

+0

Essayer d'écrire un code à faible latence. D'après ce que je comprends, P/Invoke coûte du temps. – user1173240

+0

Je pense que je vais utiliser le fichier mappé mémoire, mais je ne suis pas sûr comment les données doivent être Marshalled sur le côté géré, puis unmarshalled sur l'autre. – user1173240

Répondre

1

Sur le côté C# vous pouvez utiliser la classe MemoryMappedFile pour accéder à un fichier mappé en mémoire.

Du côté Unmanaged vous pouvez utiliser la fonction API Windows CreateFileMapping() pour ouvrir le fichier mis en correspondance, puis utilisez MapViewOfFile pour obtenir un void* aux données contenues dans le fichier. Vous pouvez ensuite convertir ce void* en int* pour accéder aux données sous la forme d'un tableau d'ints.

Vous pouvez également utiliser un événement de synchronisation nommé (en utilisant EventWaitHandle en C# et CreateEvent() en API Windows) pour signaler que le fichier MMF a été rempli.

1

Il existe différentes façon d'y parvenir -

  1. Ecrire une petite couche wrapper CLI.
  2. Utiliser une ressource partagée. par exemple. écrire dans un formulaire de fichier C# et ensuite lire en C++
+0

Je ne souhaite pas écrire un wrapper CLI. Pour la deuxième option, pourriez-vous élaborer un peu? – user1173240

+0

@ user1173240 écrivez votre tableau dans un fichier texte en utilisant C# puis lisez ce fichier en utilisant C++. par exemple. vous pouvez stocker votre tableau comme une virgule 'int' séparé, puis utiliser une virgule comme délimiteur pour le séparer en lisant en C++ –

+0

OK, je comprends la ressource partagée. Mais les données sont sensibles et ne peuvent pas être écrites dans une ressource comme un fichier texte. – user1173240