1

好的,这可能很简单,但我没有任何在 C# 中处理非托管内存的经验。我的项目中有一个结构,其中包含一个固定长度的四个字节数组:

[StructLayout(LayoutKind.Sequential)]
unsafe struct MessageHeader {
    ...
    public fixed byte Prefix[4];
    ...
}

现在我要做的就是创建一个 MessageHeader 类型的对象并将一些字节分配给前缀。我尝试了以下方法:

MessageHeader x;
unsafe {
    fixed (byte* ptr = x.Prefix) {
        Marshal.Copy(new byte[] { 128 , 64, 128, 64 }, 0, new IntPtr(ptr), 4); 
    }
    ...
}

但是我收到以下错误:“您不能使用固定语句来获取已经固定表达式的地址”。

我试图在没有固定的情况下使用它:

Marshal.Copy(new byte[] { 128, 64, 128, 64 }, 0, new IntPtr(x.Prefix), 4);

但这给了我一个可能未初始化的结构的错误。这不应该与写入任意非托管缓冲区无关吗?

4

1 回答 1

1

试试这个。已经是指针,x.Prefix并且已经修复。

MessageHeader x;

// other ways to initialize x:
// var x = default(MessageHeader);
// var x = new MessageHeader();

unsafe
{
    Marshal.Copy(new byte[] { 128, 64, 128, 64 }, 0, new IntPtr(x.Prefix), 4);
}
于 2013-06-28T09:55:49.693 回答