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;
个人认为主要要考虑字节对齐,而不要考虑形式上的统一
那么在C#里面直接都使用
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 300 )]
public byte[] byRes;
个人认为主要要考虑字节对齐,而不要考虑形式上的统一
#2
http://www.cnblogs.com/eaglet/archive/2010/02/23/1671642.html
#3
不太明白您的意思,请细说
#4
好像如果联合里面有引用 编译就会报错!
#5
先说下你出错的原因
在C#中使用struct来模拟联合,有个限制是不能同时使用值类型和引用类型
可惜你都用了
所以我的意思是,在C#中就不要管联合了,直接都认为是二进制byte[]
所有有联合的类型都用byte[]来处理,不知道这样是否可以?
在C#中使用struct来模拟联合,有个限制是不能同时使用值类型和引用类型
可惜你都用了
所以我的意思是,在C#中就不要管联合了,直接都认为是二进制byte[]
所有有联合的类型都用byte[]来处理,不知道这样是否可以?
#6
了解联合是啥意思不就明白怎么做了。联合体实际就是占用内存最大的那个结构体。先用一个相似的结构体获取过来。再转为二进制。这样你想转为啥就可以转为啥了。
#7
刚刚接触C# 不是很懂!能否帮忙写下代码!
#1
既然是联合,最后一个变量是 BYTE byRes[300];
那么在C#里面直接都使用
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 300 )]
public byte[] byRes;
个人认为主要要考虑字节对齐,而不要考虑形式上的统一
那么在C#里面直接都使用
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 300 )]
public byte[] byRes;
个人认为主要要考虑字节对齐,而不要考虑形式上的统一
#2
http://www.cnblogs.com/eaglet/archive/2010/02/23/1671642.html
#3
不太明白您的意思,请细说
#4
好像如果联合里面有引用 编译就会报错!
#5
先说下你出错的原因
在C#中使用struct来模拟联合,有个限制是不能同时使用值类型和引用类型
可惜你都用了
所以我的意思是,在C#中就不要管联合了,直接都认为是二进制byte[]
所有有联合的类型都用byte[]来处理,不知道这样是否可以?
在C#中使用struct来模拟联合,有个限制是不能同时使用值类型和引用类型
可惜你都用了
所以我的意思是,在C#中就不要管联合了,直接都认为是二进制byte[]
所有有联合的类型都用byte[]来处理,不知道这样是否可以?
#6
了解联合是啥意思不就明白怎么做了。联合体实际就是占用内存最大的那个结构体。先用一个相似的结构体获取过来。再转为二进制。这样你想转为啥就可以转为啥了。
#7
刚刚接触C# 不是很懂!能否帮忙写下代码!