2016-07-10 1 views
1

私は共有メモリファイル内にメモリセグメントを持っています。メモリセグメントは、最後にバッファ要素の固定サイズの配列で構成されています。サイズ私は構造体の終わりに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#で可能ですか?何とか構造体と共有メモリ内のmemorylocationとの間の接続を作成しますか?

答えて

1

C#で安全でないコードを使用することもできます。同じコードが動作します(var pHeader = (HeaderType*)pSharedMem;)。

もちろん、安全でないコードを使用し、このように構造体を使用できるようにするための要件が​​あります。ウェブ検索で簡単に検索できます。

関連する問題