在C#中使用带引用(也是联合体)的联合体,在字节流转换成结构体的最后一步出错了

最近在用xamarin开发一个socket通信程序

先看代码

[StructLayout(LayoutKind.Explicit,Pack =1)]
        public struct NETCMD  //指令包
        {
            [FieldOffset(0)] public uint16_t Frame;         
            [FieldOffset(2)] public uint16_t CmdType;      
            [FieldOffset(4)] public uint32_t DevID;
            [FieldOffset(8)] public CmdData CmdData;  
        };

[StructLayout(LayoutKind.Explicit,Pack =1)]
        public struct CmdData       //命令数据
        {
            [FieldOffset(0), MarshalAs(UnmanagedType.ByValArray, SizeConst = 56)] public uint8_t[] Batydata;
            [FieldOffset(0)] public DevInfo DevInfo;
            [FieldOffset(0)] public RcvJPGInfo jpgInfo;
        };

[StructLayout(LayoutKind.Explicit,Pack =1)]
        public struct DevInfo    //设备信息
        {

            [FieldOffset(0)] public uint32_t ManCode;     
            [FieldOffset(4)] public uint32_t ProID;      
            [FieldOffset(8), MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public uint8_t[] MACadd;     
            [FieldOffset(14)] public uint32_t Edition_num;     
            [FieldOffset(18)] public uint16_t Crc;  
            [FieldOffset(20)] public uint16_t Vid;   
            [FieldOffset(22)] public uint16_t Pid;   
            [FieldOffset(24)] public uint16_t Name;   
            [FieldOffset(26), MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public uint16_t[] CheckDot; 
            [FieldOffset(42)] public uint16_t KeyInfo;    
        }

[StructLayout(LayoutKind.Explicit,Pack =1)]
        public struct RcvJPGInfo           //JPG信息
        {
            [FieldOffset(0), MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public uint8_t[] jpg_name;
            [FieldOffset(16)] public uint16_t jpg_filesize;
            [FieldOffset(18)] public uint16_t jpg_width;
            [FieldOffset(20)] public uint16_t jpg_height;
        };

//然后时结构转换

public static Object BytesToStruct(Byte[] bytes, Type strcutType)
        {
            int size = Marshal.SizeOf(strcutType);
            IntPtr buffer = Marshal.AllocHGlobal(size);

            try
            {
                Marshal.Copy(bytes, 0, buffer, size);
                return Marshal.PtrToStructure(buffer, strcutType);
            }
            catch(Exception e)
            {
                return e;
            }
            finally
            {
                Marshal.FreeHGlobal(buffer);
            }
        }

编译没出错
但当收到客户端消息的时候,在把流转换成结构体的时候
在 Marshal.PtrToStructure(buffer, strcutType); 这一步直接闪退

这是输出的错误信息:
[] Type CmdData which has an [ExplicitLayout] attribute cannot have a reference field at the same offset as another field.
[libc] Fatal signal 6 (SIGABRT), code -6 (SI_TKILL) in tid 4327 (Thread-15), pid 4181

大概意思就是引用字段的偏移量不能和另一个字段的偏移量相同

虽然大概知道是什么问题
但找了很多资料,也不知道怎么解决
希望有人能指导一下

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答

本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。

​​​​因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。