【发布时间】:2012-11-28 05:45:34
【问题描述】:
我正在尝试在这篇 msdn 文章中创建以下结构。我正在尝试学习整个 FieldOffset,但不知道从哪里开始。
我基本上是这样做的。
[StructLayout(LayoutKind.Explicit, Size=12)]
public struct DHCP_OPTION_DATA_ELEMENT {
[FieldOffset(0)]
public DHCP_OPTION_DATA_TYPE OptionType;
[FieldOffset(4)]
public byte ByteOption;
[FieldOffset(4)]
public uint WordOption;
[FieldOffset(4)]
public UInt32 DWordOption;
[FieldOffset(4)]
public UInt32 DWordDWordOption;
[FieldOffset(4)]
public uint IpAddressOption;
[FieldOffset(4)]
public IntPtr StringDataOption;
[FieldOffset(4)]
public DHCP_BINARY_DATA BinaryDataOption;
[FieldOffset(4)]
public DHCP_BINARY_DATA EncapsulatedDataOption;
[FieldOffset(4)]
public string Ipv6AddressDataOption;
}
但是,它对我咆哮,说明以下异常。
it contains an object field at offset 4 that is incorrectly aligned or
overlapped by a non-object field.
【问题讨论】:
-
DHCP_OPTION_DATA_TYPE和DHCP_BINARY_DATA是什么? -
@VMAtm 它在链接中说。
-
你的回答都是合理的。我会评论说,将联合与结构分开要容易得多。将联合声明为具有显式布局的 C# 结构。不要指定
Size。对所有元素使用FieldOffset(0)。然后将该联合类型包含在整个结构中。对于整体结构,使用默认的顺序布局。所以你实际上并不需要StructLayout属性。