union{
  NET_DVR_DEC_STREAM_DEV    struDecStreamDev;
  NET_DVR_PU_STREAM_URL     struUrlInfo;
  BYTE                      byRes[300];
}这个是C的联合转化成C#结构体 为
  [StructLayoutAttribute(LayoutKind.Explicit)]
        public struct NET_DVR_DEC_STREAM_MODE//取流模式配置联合体。
        {
           [FieldOffset(0)]
            public NET_DVR_DEC_STREAM_DEV struDecStreamDev;
           [FieldOffset(0)]
            public NET_DVR_PU_STREAM_URL struUrlInfo;
            [FieldOffset(0)]
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 300 , ArraySubType = UnmanagedType.I1)]
            public byte[] byRes;
        }运行代码过后报错为:
未能从程序集“tc, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”中加载类型“NET_DVR_DEC_STREAM_MODE”,因为它在 0 偏移位置处包含一个对象字段,该字段已由一个非对象字段不正确地对齐或重叠。我这个结构体要作为另一个结构体的字段的。请大神帮忙看看这个联合要怎么转才对。c#联合结构体

解决方案 »

  1.   

    既然是联合,最后一个变量是 BYTE                      byRes[300];那么在C#里面直接都使用
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 300 )]
    public byte[] byRes;个人认为主要要考虑字节对齐,而不要考虑形式上的统一
      

  2.   

    http://www.cnblogs.com/eaglet/archive/2010/02/23/1671642.html
      

  3.   

    先说下你出错的原因在C#中使用struct来模拟联合,有个限制是不能同时使用值类型和引用类型
    可惜你都用了所以我的意思是,在C#中就不要管联合了,直接都认为是二进制byte[]所有有联合的类型都用byte[]来处理,不知道这样是否可以?