アンマネージ コードと .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;
}
推測では、これは次のようにマッピングされます。
上=左
右=上
下=右
左=下
だから私の質問は単純です、私は、各変数のアクセス指定子、さらには変数名に関して管理された構造を変更することはできますが、変数の順序を変更することはできないという私の仮定は正しいですか?