我正在尝试使用Write<T>
类上的MemoryMappedViewAccessor
函数。在这种情况下,我的T
如下:
[StructLayout(LayoutKind.Explicit)]
public struct Message
{
public void AddString(string str)
{
if (stringContents == null)
stringContents = new byte[1024 * 10];
stringContents = Encoding.ASCII.GetBytes(str);
}
public string GetString()
{
if (stringContents == null)
return string.Empty;
return Encoding.ASCII.GetString(stringContents);
}
[FieldOffset(0)]
public byte[] stringContents;
}
但是,当我拨打电话时,例如:
//Initialized Elsewhere: MemoryMappedViewAccessor writer
Message messageAlreadyOnWire = new Message();
messageAlreadyOnWire.AddString(data);
writer.Write<Message>(0, ref messageAlreadyOnWire);
我收到如下错误:
指定的Type必须是不包含引用的结构。 参数名称:type
我的struct中唯一的'reference'是一个字节数组。有什么方法可以解决这个问题吗?我没有使用固定长度的字节数组,但是我不确定如何在没有深入unsafe
的情况下声明一个,我宁愿不这样做。
答案 0 :(得分:0)
尝试将[MarshalAs(UnmanagedType.ByValArray, SizeConst = Your_Size)]
应用于Message.stringContents
。
答案 1 :(得分:0)
作为此问题的解决方法,您可以使用MemoryMappedViewStream而不是MemoryMappedViewAccessor;然后使用传统的流读/写而不是访问器。