bellow代码是本机win32代码的封送处理。但我收到一条错误消息
类型加载异常,无法从程序集加载,因为它包含偏移量为0的对象字段,该对象字段被非对象字段不正确地对齐或重叠。
有一个结构S1,它包含value-type成员和reference-type。这个结构是一个必须有fieldOffset的联盟成员,但是所有的S1成员都不能从fieldOffset 0开始--它们是引用和价值type...how的混合体,我能处理吗??
[StructLayout(LayoutKind.Sequential)]
public struct S1
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = Const.FieldSizeMsgid + 1)]//Reference Type
public String MsgId;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = Const.FieldSizeTime + 1)]//Reference Type
public String SendTime;
public UInt32 SubsSeq;//Value Type
public UInt32 ServTime;//Value Type
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = Const.FieldSizeFillerA1 + 1)]//Reference Type
public String Filler;
}
[StructLayout(LayoutKind.Explicit)]
public struct AdminData
{
[FieldOffset(0)] public S1 S11;// get an error because the S1 has both reference type member and value type member
[FieldOffset(0)] public S2 S22;
[FieldOffset(0)] public S3 S33;
}我知道我必须将S1分解成两个结构,一个具有值类型成员,另一个用于引用类型的members..but,我不知道如何在AdminData中引用它们,这是一个联合。
编辑
这是c++代码
typedef struct S1
{
char MsgId [Const.FieldSizeMsgid + 1];//Reference Type
char SendTime[Const.FieldSizeTime + 1];//Reference Type
int SubsSeq;//Value Type
int ServTime;//Value Type
char Filler[Const.FieldSizeFillerA1 + 1];//Reference Type
}
union AdminData
{
S1 S11;//has both value type member and reference type member
S2 S22;//has both value type member and reference type member
S3 S33;//has both value type member and reference type member
}
typedef struct MMTPMsg
{
int Length;
short Type;
AdminData Data; //the union
long long TimeStamp;
}发布于 2014-01-07 11:58:58
正如您已经发现的,您不能在值类型之上覆盖引用类型。因此,要实现您的联合,您需要使用一个或另一个。您的结构必须包含值类型,因此我们得出结论,您必须独占使用值类型。
那么,如何将字符数组实现为值类型呢?通过使用固定大小缓冲器。
unsafe public struct S1
{
fixed byte MsgId[Const.FieldSizeTime + 1];
....
}https://stackoverflow.com/questions/20951452
复制相似问题