.NET Marshal出现的问题,这算是BUG?

ChrisAK 2012-07-25 07:47:34
关于IPv6的地址结构,msdn里是这样定义的:
typedef struct in6_addr {
union {
u_char Byte[16];
u_short Word[8];
} u;
};

写成C#声明大概就是这样:

[StructLayout(LayoutKind.Explicit)]
internal struct in6_addr
{
[FieldOffset(0)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] Byte;

[FieldOffset(0)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public ushort[] Word;

}


编译运行调用几个API试试,好像也没问题.但真的没问题吗?新建一段小程序:

unsafe static void Main(string[] args)
{
//生成点数据测试用
byte* data = stackalloc byte[16];
for (byte i = 0; i < 16; ++i)
data[i] = i;

in6_addr ip6;

ip6 = (in6_addr)Marshal.PtrToStructure(new IntPtr(data), typeof(in6_addr));

Console.WriteLine(ip6.Byte.Length);
}


输出应该是多少呢?按理说MarshalAs中声明了SizeConst = 16,应该是16吧?但编译运行后会发现其实输出的是8.
把断点打在Console输入那一行,运行中断下来后打开监视窗口,会发现ip6的Byte字段类型变成了ushort[8].内容则是8个?

交换下Byte和Word字段的声明顺序,会发现同样的事情发生了,这次是Word字段的类型变成了byte[16].内容则是16个?

我没找到相关文档有说不能这样声明的.这算bug吗?
...全文
129 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
lizhibin11 2012-07-25
  • 打赏
  • 举报
回复
字段是托管类型的可能得这样声明了

[StructLayout(LayoutKind.Explicit)]
unsafe internal struct in6_addr
{
[FieldOffset(0)]
public fixed byte Byte[16];
[FieldOffset(0)]
public fixed ushort Word[8];
}

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧