[英]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.