首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在联合中包含引用类型和值类型成员的封送结构。

在联合中包含引用类型和值类型成员的封送结构。
EN

Stack Overflow用户
提问于 2014-01-06 13:52:09
回答 1查看 395关注 0票数 0

bellow代码是本机win32代码的封送处理。但我收到一条错误消息

类型加载异常,无法从程序集加载,因为它包含偏移量为0的对象字段,该对象字段被非对象字段不正确地对齐或重叠。

有一个结构S1,它包含value-type成员和reference-type。这个结构是一个必须有fieldOffset的联盟成员,但是所有的S1成员都不能从fieldOffset 0开始--它们是引用和价值type...how的混合体,我能处理吗??

代码语言:javascript
复制
[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++代码

代码语言:javascript
复制
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; 
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-07 11:58:58

正如您已经发现的,您不能在值类型之上覆盖引用类型。因此,要实现您的联合,您需要使用一个或另一个。您的结构必须包含值类型,因此我们得出结论,您必须独占使用值类型。

那么,如何将字符数组实现为值类型呢?通过使用固定大小缓冲器

代码语言:javascript
复制
unsafe public struct S1  
{      
    fixed byte MsgId[Const.FieldSizeTime + 1];
    ....
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20951452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档