2016-07-10 6 views
1

Итак, у меня есть сегмент памяти в файле общей памяти, который в C структурирован с массивом фиксированного размера элементов буфера в конце. Размер. Я не могу иметь фиксированные массивы в C# в конце структуры. Я создал структуру буфера для инкапсуляции и просто прочитал их после прочтения заголовка, все это прекрасно работает.Отображение памяти, можно ли синхронизировать объект с ячейкой памяти?

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 
} 

сводились код это, как я прочитал:

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

Моя проблема заключается в том, что эта структура обновляется достаточно несколько раз в секунду, и в C это так просто, как pHeader = (HeaderType *)pSharedMem;, чтобы необработанный доступ к данным без постоянного считывания их в другую область. Возможно ли это на C#? Как-то установить связь между структурой и памятью в общей памяти?

ответ

1

Вы можете сделать то же самое в C# с небезопасным кодом. Тот же код работает (var pHeader = (HeaderType*)pSharedMem;).

Конечно, существуют требования, необходимые для использования небезопасного кода и возможности использования структур таким образом. Веб-поиск легко превратит их.

 Смежные вопросы

  • Нет связанных вопросов^_^