2016-07-10 6 views
1

Also habe ich ein Speichersegment in einer gemeinsamen Speicherdatei, die in C mit einer festen Größe Array von Pufferelementen am Ende strukturiert ist. Größe Ich kann keine festen Arrays in C# am Ende einer Struktur haben Ich habe eine Puffer-Struktur erstellt, um diese zu kapseln und sie nur nach dem Lesen der Überschrift zu lesen, all dies funktioniert gut.Speicher zugeordnet, kann ich ein Objekt mit einem Speicherort synchronisieren?

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 
} 

Kocht Code das ist, wie ich es gelesen:

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]); 
} 

Mein Problem ist, dass diese Struktur schon ein paar Mal pro Sekunde aktualisiert und in C ist es so einfach wie pHeader = (HeaderType *)pSharedMem; Rohzugriff zu ermöglichen zu den Daten, ohne sie ständig in einem anderen Bereich zu lesen. Ist das in C# überhaupt möglich? Irgendwie eine Verbindung zwischen einer Struktur und einer Speicherstelle im Shared Memory herstellen?

Antwort

1

Sie können das Gleiche in C# mit unsicheren Code tun. Derselbe Code funktioniert einfach (var pHeader = (HeaderType*)pSharedMem;).

Natürlich gibt es Anforderungen zu erfüllen, um unsafe Code zu verwenden und in der Lage, Strukturen auf diese Weise zu verwenden. Eine Websuche wird sie leicht aufdecken.

Verwandte Themen