内存映射,我可以将 object 与内存位置同步吗?

Memory mapped, can I synchronize an object with a memory location?

所以我在共享内存文件中有一个内存段,在 C 中,该文件的末尾有一个固定大小的缓冲区元素数组。大小 我不能在结构的末尾使用 C# 中的固定大小数组 我已经创建了一个缓冲区结构来封装它并在读取 header 后读取它们,所有这些工作正常。

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# 中完全可行吗?以某种方式在共享内存中的结构和内存位置之间建立连接?

您可以在 C# 中使用不安全代码执行相同的操作。相同的代码可以正常工作 (var pHeader = (HeaderType*)pSharedMem;)。

当然要满足使用不安全代码和能够以这种方式使用结构的要求。网络搜索很容易找到它们。