最近在用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
大概意思就是引用字段的偏移量不能和另一个字段的偏移量相同
虽然大概知道是什么问题
但找了很多资料,也不知道怎么解决
希望有人能指导一下