内存映射,我可以将 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;
)。
当然要满足使用不安全代码和能够以这种方式使用结构的要求。网络搜索很容易找到它们。
所以我在共享内存文件中有一个内存段,在 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;
)。
当然要满足使用不安全代码和能够以这种方式使用结构的要求。网络搜索很容易找到它们。