簡體   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