7

アンマネージ コードと .NET でのプラットフォーム呼び出しに何時間も費やしてきました。以下のコードは、管理されていないデータが .NET で管理されているオブジェクトにマップされる方法に関して、私を困惑させていることを示しています。

この例では、RECT構造を使用します。

C++ RECT 実装 (アンマネージ Win32 API)

typedef struct _RECT {
  LONG left;
  LONG top;
  LONG right;
  LONG bottom;
} RECT, *PRECT;

C# RECT 実装 (マネージ .NET/C#)

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
    public int left, top, right, bottom;
}

さて、私の C# の同等物が動作するはずですよね? つまり、すべての変数は C++ 構造体と同じ順序であり、同じ変数名を使用しています。

私の仮定はLayoutKind.Sequential、アンマネージ データが、C++ 構造に現れるのと同じ順序でマネージ オブジェクトにマップされることを意味します。つまり、データは左から始まり、上、右、下の順にマッピングされます。

これに基づいて、C# 構造を変更できるはずです...

C# RECT 実装 (少しクリーン)

[StructLayout(LayoutKind.Sequential)]
public struct Rect //I've started by giving it a .NET compliant name
{
    private int _left, _top, _right, _bottom; // variables are no longer directly accessible.

    /* I can now access the coordinates via properties */
    public Int32 Left
    {
        get { return _left; }
        set { this._left = value; }
    }

    public Int32 Top
    {
        get { return _top; }
        set { this._top = value; }
    }

    public Int32 Right
    {
        get { return _right; }
        set { this._right = value; }
    }

    public Int32 Bottom
    {
        get { return _bottom; }
        set { this._bottom = value; }
    }
}

では、変数が間違った順序で宣言された場合はどうなるでしょうか? おそらく、座標が正しいものにマップされなくなるため、座標が台無しになるのでしょうか?

public struct RECT
{
    public int top, right, bottom, left;
}

推測では、これは次のようにマッピングされます。

上=左

右=上

下=右

左=下

だから私の質問は単純です、私は、各変数のアクセス指定子、さらには変数名に関して管理された構造を変更することはできますが、変数の順序を変更することはできないという私の仮定は正しいですか?

4

4 に答える 4

1

structC#での a の既定のマッピングは ですLayoutKind.Sequential。これにより、コンパイラが変数を再配置してメモリを最適化するのを防ぎ、正しいマッピングを保証します。

LayoutKind.Explicitただし、 、 、およびを使用して、変数の異なる順序をコンパイラに伝えることができますFieldOffsetAttribute

[StructLayout(LayoutKind.Explicit)]
public struct Rect
{
    [FieldOffset(8)]
    public int right;

    [FieldOffset(4)]
    public int top;

    [FieldOffset(0)]
    public int left;

    [FieldOffset(12)]
    public int bottom;
}

の値はFieldOffsetAttribute、変数の先頭の構造体のバイト位置を示します。

于 2013-04-15T10:36:46.553 に答える
0

各変数のアクセス指定子、さらには変数名に関して管理対象構造を変更できますが、変数の順序を変更することはできないという私の仮定は正しいですか?

はい、そうです。アクセス指定子も変数名も、構造体の配置方法には影響しません。

于 2013-04-15T19:11:27.820 に答える