3

AMD64 で C# からNtGetContextThreadを呼び出そうとしています。問題は、AMD64 のCONTEXT構造体を 16 バイト境界に揃える必要があり、NtGetContextThreadを呼び出すと常にSTATUS_DATATYPE_MISALIGNMENT. C# がPack属性を使用して構造体の個々のメンバーを整列できることは承知していますが、構造全体を整列させることはできないようです。これを行う方法はありますか?

編集: 明確にするために、個々のメンバーを揃えたくありません。全体の構造を揃えたい。

4

2 に答える 2

2

あなたの質問からは、StructLayout 属性の Pack プロパティを完全に理解しているかどうかは明確ではありません。詳細については、このmsdn の記事を参照してください。

私があなたを正しく理解していれば、あなたが探しているのは、構造体の各メンバーを個別に明示的に整列させる機能です。それが目標である場合は、次のように StructLayout 属性と FieldOffset 属性を使用してそれを行うことができます。

[StructLayout(LayoutKind.Explicit)]
public struct Message
{
    [FieldOffset(0)]
    public int a;
    [FieldOffset(4)]
    public short b;
    [FieldOffset(6)]
    public int c;
    [FieldOffset(22)] //Leave some empty space just for the heck of it.
    public DateTime dt;

}

ただし、.NET CF マーシャラーには予期しないルールがいくつかあることに注意してください。たとえば、配列は常に 4 バイト境界に揃える必要があります。この問題には回避策がありますが、このような問題が発生する可能性があることに注意してください。

于 2009-08-13T12:50:19.497 に答える