[英]How can I create a privately-settable read-only struct (such as Size) in 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.