110,535
社区成员
发帖
与我相关
我的任务
分享
[StructLayout(LayoutKind.Explicit)]
public struct MyStruct
{
[FieldOffset(0)]
public UInt32 dwValue;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
[FieldOffset(0)]
public char[] s1;
}
MyStruct ms = new MyStruct(); // 运行到这里就会出错,为什么啊?
// 出错信息是:An unhandled exception of type 'System.TypeLoadException'
// occurred in System.Windows.Forms.dll
而如果是把结构体的声明改为:
public struct MyStruct
{
[FieldOffset(0)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public byte[] bHigh;
[FieldOffset(64)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public byte[] bLow;
[FieldOffset(0)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public char[] s1;
}
就不会出错,这是为什么啊?
如果我的结构是这样的话,
[StructLayout(LayoutKind.Sequential)]
public struct MyStruct1
{
public UInt16 wTime;
public Byte ucOption;
public UInt16 wAntenaFlag;
public UInt32 dwSelectAddr;
public Byte ucSelectDataLength;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public Byte[] ucSelectData;
};
[StructLayout(LayoutKind.Sequential)]
public struct MyStruct2
{
UInt16 wTime;
Byte ucOption;
UInt16 uAntenaFlag;
UInt32 uMetadataFlag;
UInt32 uSelectAddr;
Byte ucSelectDataLength;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
Byte[] ucSelectData;
};
[StructLayout(LayoutKind.Explicit)]
public struct MyStruct
{
[FieldOffset(0)]
public MyStruct1 myStruct1;
[FieldOffset(0)]
public MyStruct2 myStruct2;
}
MyStruct ms = new MyStruct();
[StructLayout(LayoutKind.Explicit)]
public struct MyStruct
{
[FieldOffset(0)]
public UInt32? dwValue;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
[FieldOffset(0)]
public char[] s1;
}