2016-07-10 1 views
1

J'ai donc un segment de mémoire dans un fichier de mémoire partagée qui en C est structuré avec un tableau de taille fixe d'éléments de tampon à la fin. Taille Je ne peux pas avoir des tableaux de taille fixe en C# à la fin d'une structure J'ai créé une structure de tampon pour encapsuler ceci et juste les lire après avoir lu l'en-tête, tout cela fonctionne très bien.Mémoire mappée, puis-je synchroniser un objet avec un emplacement de mémoire?

struct SDKHeader { 
    int a; 
    int b; 
    int numBuf; //Number of buffers to read from 
    long c; 
} 

struct SDKBuffer 
{ 
    int size; 
    int location; //Position in shared memory 
} 

Ramenée Code voici comment je l'ai lu:

memoryMap = MemoryMappedFile.OpenExisting(MemMapFilename); 
memoryAccessor = memoryMap.CreateViewAccessor(); 

int headerSize = Marshal.SizeOf(typeof(SDKHeader)); 
memoryAccessor.Read(0, out header); 

int bufferSize = Marshal.SizeOf(typeof(SDKBuffer)); 
buffers = new SDKBuffer[header.numBuf]; 
for(int i = 0; i < header.numBuf; i++) 
{ 
    memoryAccessor.Read(headerSize + i * bufferSize, out buffers[i]); 
} 

Mon problème est que cette structure est mise à jour tout à fait plusieurs fois par seconde et en C, il est aussi facile que pHeader = (HeaderType *)pSharedMem; pour permettre l'accès brut aux données sans le lire continuellement dans un autre domaine. Est-ce possible du tout en C#? D'une manière ou d'une autre, établir une connexion entre une structure et un emplacement de mémoire dans la mémoire partagée?

Répondre

1

Vous pouvez faire la même chose en C# avec un code dangereux. Le même code fonctionne juste (var pHeader = (HeaderType*)pSharedMem;).

Bien sûr, il y a des exigences à satisfaire pour utiliser un code dangereux et pour pouvoir utiliser des structures de cette manière. Une recherche sur le Web va facilement les activer.