繁体   English   中英

如何在 C# 中创建这个结构?

[英]How can I create this struct in C#?

我正在尝试在这篇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.

将其视为 IntPtr,而不是字符串。

但是,当使用 IntPtr 时,请务必确保您自己进行清理,因为您现在将使用非托管内存,因此 GC 不会帮助您,每次通过时都会导致内存泄漏这个结构周围。

您很可能希望使用 Marshal.PtrToStringUni 函数,正如 shf301 在另一个答案中所建议的那样。

错误

它包含偏移 4 处的对象字段,该对象字段未正确对齐或与非对象字段重叠。

是由于非对象(重叠blittable )类型(例如Uint32 )与对象类型(非blittable)。 封送拆收器无法处理。 marhshaler 不知道联合的哪个字段是有效的(因为它不知道如何解码OptionType所以它不知道它是否应该编组字符串值或整数值。试图将整数值编组为string 会导致崩溃(因为整数值不会指向有效的字符串),因此编组器会抛出异常而不是让您崩溃。

因此,您必须通过将字符串定义为IntPtr并使用Marshal.PtrToStringUni()Marshal.PtrToStringAnsi()来手动编组字符串。

您也可能对 DHCP_BINARY_DATA 有同样的问题。

你有这个代码:

[FieldOffset(4)]
public string Ipv6AddressDataOption;

字符串为引用类型(对象),其他字段为值类型(非对象)。 所以你必须改变Ipv6AddressDataOption的偏移Ipv6AddressDataOption

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM