誤って非対象フィールド誤差によって整列またはオーバーラップ
-
19-09-2019 - |
質問
私は、次の構造を作成しようとしています:
[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を変更した場合、これは離れて行きます。
所属していません StackOverflow