Marshal.StructureToPtr访问冲突

时间:2013-03-09 13:36:47

标签: c# sockets memory struct marshalling

您好我有这个结构

  [StructLayout (LayoutKind.Sequential)]
 public struct Transfer_packet 
        {
            public int  _packet_type; // 0 is action 1 is data
            public int _packet_len; // length of data
            public byte[] _data;//;= new byte[DataLenght];
            public void fill()
            {

            }
            public byte[] deserialize()
            {
                int size = System.Runtime.InteropServices.Marshal.SizeOf(this);
                byte[] arr = new byte[size];
                IntPtr ptr = System.Runtime.InteropServices.Marshal.AllocHGlobal(size);
                System.Runtime.InteropServices.Marshal.StructureToPtr(this, ptr, true);  // error raised
                System.Runtime.InteropServices.Marshal.Copy(ptr,arr,0,size);
                System.Runtime.InteropServices.Marshal.FreeHGlobal(ptr);
                return arr;
            }
        }

我正在尝试将struct的内容转换为字节数组,以便通过网络发送并在其他计算机中恢复它,但在我上面提到的代码中,我收到错误尝试读取或写入受保护的内存。这通常表明其他内存已损坏。我不知道为什么每件事对我来说都很好,但是元帅正在尝试访问受保护的内存,我怎样才能将结构数据转换为其内部的字节数组块我用C ++完美地用简单的memcpy完成它但在c#中导致错误!!!

谢谢

1 个答案:

答案 0 :(得分:1)

true参数要求框架删除源内存。当然,这个记忆并没有被编组者分配,所以它失败了。请尝试以下方法:

System.Runtime.InteropServices.Marshal.StructureToPtr(this, ptr, false);