2

この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.
4

3 に答える 3

2

文字列ではなく、IntPtrとして扱います。

ただし、IntPtrを使用する場合は、自分の後でクリーンアップするように注意してください。これは、管理されていないメモリで作業するため、GCが役に立たず、通過するたびに適切なメモリリークが発生するためです。この構造体。

別の回答でshf301によって提案されているように、Marshal.PtrToStringUni関数を使用することをお勧めします。

于 2012-11-28T06:56:22.260 に答える
1

エラー

オフセット4にオブジェクトフィールドが含まれていますが、オブジェクトフィールドが正しく配置されていないか、オブジェクトフィールドと重なっています。

非オブジェクト( blittable)タイプ(例Uint32)とオブジェクトタイプ(non-blittable)が重複しているためです。マーシャラーはそれを処理できません。マーシャラーは、ユニオンのどのフィールドが有効であるかを知りません(デコード方法がわからOptionTypeないため、文字列値と整数値のどちらをマーシャリングする必要があるかがわかりません。整数値を文字列にマーシャリングしようとしています(整数値は有効な文字列を指さないため)クラッシュにつながるため、マーシャラーはクラッシュを許可する代わりに例外をスローします。

IntPtrしたがって、文字列を'sとして定義し、Marshal.PtrToStringUni()またはMarshal.PtrToStringAnsi( )を使用して、文字列を手動でマーシャリングする必要があります。

DHCP_BINARY_DATAでも同じ問題が発生する可能性があります。

于 2012-11-28T07:15:07.380 に答える
0

あなたはこのコードを持っています:

[FieldOffset(4)]
public string Ipv6AddressDataOption;

文字列は参照型(オブジェクト)であり、他のフィールドは値型(非オブジェクト)です。したがって、のオフセットを変更する必要がありますIpv6AddressDataOption

于 2012-11-28T05:50:18.323 に答える