C语言中的联合中存在结构体,如何转化成C#中的结构体!请高人指点不胜感激

时间:2022-06-13 00:23:59
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 偏移位置处包含一个对象字段,该字段已由一个非对象字段不正确地对齐或重叠。

我这个结构体要作为另一个结构体的字段的。请大神帮忙看看这个联合要怎么转才对。

7 个解决方案

#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


引用 1 楼 wodegege10 的回复:
既然是联合,最后一个变量是 BYTE                      byRes[300];

那么在C#里面直接都使用
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 300 )]
public byte[] byRes;

个人认为主要要考虑字节对齐,而不要考虑形式上的统一
  ……

不太明白您的意思,请细说

#4


引用 2 楼 bdmh 的回复:
http://www.cnblogs.com/eaglet/archive/2010/02/23/1671642.html

好像如果联合里面有引用 编译就会报错!

#5


先说下你出错的原因

在C#中使用struct来模拟联合,有个限制是不能同时使用值类型和引用类型
可惜你都用了

所以我的意思是,在C#中就不要管联合了,直接都认为是二进制byte[]

所有有联合的类型都用byte[]来处理,不知道这样是否可以?

#6


了解联合是啥意思不就明白怎么做了。联合体实际就是占用内存最大的那个结构体。先用一个相似的结构体获取过来。再转为二进制。这样你想转为啥就可以转为啥了。

#7


引用 6 楼 zanfeng 的回复:
了解联合是啥意思不就明白怎么做了。联合体实际就是占用内存最大的那个结构体。先用一个相似的结构体获取过来。再转为二进制。这样你想转为啥就可以转为啥了。

刚刚接触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


引用 1 楼 wodegege10 的回复:
既然是联合,最后一个变量是 BYTE                      byRes[300];

那么在C#里面直接都使用
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 300 )]
public byte[] byRes;

个人认为主要要考虑字节对齐,而不要考虑形式上的统一
  ……

不太明白您的意思,请细说

#4


引用 2 楼 bdmh 的回复:
http://www.cnblogs.com/eaglet/archive/2010/02/23/1671642.html

好像如果联合里面有引用 编译就会报错!

#5


先说下你出错的原因

在C#中使用struct来模拟联合,有个限制是不能同时使用值类型和引用类型
可惜你都用了

所以我的意思是,在C#中就不要管联合了,直接都认为是二进制byte[]

所有有联合的类型都用byte[]来处理,不知道这样是否可以?

#6


了解联合是啥意思不就明白怎么做了。联合体实际就是占用内存最大的那个结构体。先用一个相似的结构体获取过来。再转为二进制。这样你想转为啥就可以转为啥了。

#7


引用 6 楼 zanfeng 的回复:
了解联合是啥意思不就明白怎么做了。联合体实际就是占用内存最大的那个结构体。先用一个相似的结构体获取过来。再转为二进制。这样你想转为啥就可以转为啥了。

刚刚接触C# 不是很懂!能否帮忙写下代码!