質問

私は、次の構造を作成しようとしています:

    [StructLayout(LayoutKind.Explicit, Size=14)]
    public struct Message
    {
        [FieldOffset(0)]
        public ushort X;
        [FieldOffset(2)]
        [MarshalAs(UnmanagedType.ByValArray, SizeConst=5)]
        private ushort[] Y;
        [FieldOffset(12)]
        public ushort Z;
    }

と、私は次のエラーを取得します

は、オブジェクトフィールドは、AT誤っ非対象フィールドによって整列または重なっている4オフセット含まれているため、アセンブリから型「メッセージ」をロードできませんでした。

これはエラーの原因となっている理由は、誰もが知っていますか?

注:私は、コンパクトなフレームワークで働いているので、私はパックを使用することはできません。 おかげます。

役に立ちましたか?

解決

CFマーシャラーは事のこのタイプではあまりよくないですし、何をしようとしていることはサポートされていません。問題は、最初の要素が非整列であることを知っているということですが、配列の各要素はまた、整列していないだろうということを理解していないようです。

あなたは行動が、この例で動作を確認できます:

[StructLayout(LayoutKind.Explicit, Size = 14)]
public struct Message
{
    [FieldOffset(0)]
    public ushort X;

    [FieldOffset(2)]
    private ushort Y1;

    [MarshalAs(UnmanagedType.LPArray)]
    [FieldOffset(4)]
    private ushort[] Y2;

    [FieldOffset(12)]
    public ushort Z;
}

このタイプの構造のために、私はマーシャラーはとにかくメンバーのそれぞれを処理してみましょうことはありません。構造が小さいので、このように個々の項目を抜け出すます:

[StructLayout(LayoutKind.Explicit, Size = 14)]
public struct Message
{
    [FieldOffset(0)]
    public ushort X;

    [FieldOffset(2)]
    private ushort Y1;

    [FieldOffset(4)]
    private ushort Y2;

    [FieldOffset(6)]
    private ushort Y3;

    [FieldOffset(8)]
    private ushort Y4;

    [FieldOffset(10)]
    private ushort Y5;

    [FieldOffset(12)]
    public ushort Z;
}

または、次のようにシミュレートされた "労働組合" を使用します:

public struct Y
{
    public ushort a;
    public ushort b;
    public ushort c;
    public ushort d;
    public ushort e;
}

[StructLayout(LayoutKind.Explicit, Size = 14)]
public struct Message
{
    [FieldOffset(0)]
    public ushort X;

    [FieldOffset(2)]
    private Y Y;

    [FieldOffset(12)]
    public ushort Z;
}

他のヒント

あなたの配列は、「X」が重複しているため、問題が発生しています。 ULONGは、C#で、(、ULONGがUInt32型であるC ++で)UInt64型であるため、実際には8バイトです。

あなたがuintに8、または変更されたXに2番目のFieldOffsetを変更した場合、これは離れて行きます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top