3

すべてヘッダー構造体で始まる複数の構造体があります。このような

public struct BaseProtocol {
    public Header header;
    public Footer footer;
};

ヘッダーは

public struct Header {
    public Byte start;
    public Byte group;
    public Byte dest;
    public Byte source;
    public Byte code;
    public Byte status;
};

問題は、それらを Byte[] で結合する必要があることです。これでやってみた

[StructLayout( LayoutKind.Explicit, Size=255 )]
public struct RecBuffer {

    [FieldOffset( 0 )]
    public Header header;

    [FieldOffset( 0 )]
    [MarshalAs( UnmanagedType.ByValArray, ArraySubType = UnmanagedType.I1, SizeConst = 255 )]
    public Byte[] buffer;
};

バッファにデータを入力すると、ヘッダーからデータを取得できません。c++ のユニオンと同じように c# を作成するにはどうすればよいですか?

4

1 に答える 1

8

Byte[] は参照型フィールドであり、値型フィールドでオーバーレイすることはできません。固定サイズのバッファが必要であり、それを でコンパイルする必要があります/unsafe。このような:

[StructLayout(LayoutKind.Explicit, Size = 255)]
public unsafe struct RecBuffer
{

    [FieldOffset(0)]
    public long header;

    [FieldOffset(0)]
    [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.I1, SizeConst = 255)]
    public fixed Byte buffer[255];
};
于 2012-04-24T14:39:36.580 に答える