2010-03-11 7 views
3

Je cherche essentiellement un moyen de passer des instances à travers les programmes/processus sans sérialiser les instances, dans .NET 4.0.Est-il possible de passer un "pointeur" d'instance à un autre processus via un fichier mappé en mémoire?

Oui, je manque mon bon vieux pointeurs dangereux 100%;)

Je pensais que la nouvelle intégration des fichiers mappés en mémoire à 4.0 .NET me aider, après avoir lu quelque part que vous pouvez passer des références/pointeurs "nativement" en l'utilisant.

Cependant, lorsque je tente quelque chose comme

var mmf = MemoryMappedFile.CreateFromFile(@"C:\temp\test.mp", FileMode.Create, "mmf", 
              1024*1024*300, 
              MemoryMappedFileAccess.ReadWrite); 
var ss = new SimpleStruct(); 
ss.items = _items; //Collection of Items objects 
var FileMapView = mmf.CreateViewAccessor(); 
FileMapView.Write<SimpleStruct>(0, ref ss); //Exception 

Je reçois la ArgumentException suivante:

The specified Type must be a struct containing no references. 

Est-il possible de passer des références autour de l'utilisation MMF? Si ce n'est pas le cas, y a-t-il une quelconque pour passer des instances autour des programmes/processus?

Répondre

3

Cela n'est pas non plus possible dans le code non géré, une valeur de pointeur n'a aucune signification dans un autre processus. Les objets gérés résident sur le tas collecté par la corbeille, qui ne coïncidera jamais avec l'adresse d'une vue MMF. Même si c'était le cas, le garbage collector causerait des ravages. Principales raisons pour lesquelles il a fallu 4 versions de .NET pour les fichiers MMF pour être pris en charge.

La sérialisation des objets gérés vers la vue est inévitable.

+0

Je peux facilement déduire le sens, c'est-à-dire le type de données, du contexte. Cela signifie essentiellement que je saurais comment renvoyer mon pointeur "vide" à son vrai type. Les deux processus partageraient bien entendu un ensemble commun définissant certains types communs. Je suppose que ce que j'aurais aimé voir, c'est la possibilité de * goupiller * les instances gérées, comme vous pouvez le faire avec des types non gérés. –

+0

Il ne peut pas fonctionner par conception. La disposition de la mémoire des objets gérés est indétectable. Le compilateur JIT tire parti de cela en réorganisant les champs d'une structure, par exemple, pour obtenir un alignement correct et une taille totale minimale. Lancer un IntPtr nécessite Marshal.PtrToStructure(). La version gérée de memcpy(). –

Questions connexes