LayoutKind 列挙体
アンマネージ コードにエクスポートするときにオブジェクトのレイアウトを制御します。
<Serializable>
Public Enum LayoutKind
[C#]
[Serializable]
public enum LayoutKind
[C++]
[Serializable]
__value public enum LayoutKind
[JScript]
public
Serializable
enum LayoutKind
解説
この列挙体は、 StructLayoutAttribute で使用されます。共通言語ランタイムは既定で、 Auto レイアウトを使用します。 Auto 値にかかわるレイアウト関連の問題の発生を防ぐため、C#、Visual Basic .NET、および C++ のコンパイラは、値型に対して Sequential レイアウトを指定します。
メンバ
メンバ名 | 説明 |
---|---|
Auto
.NET Compact Framework でもサポート。 |
ランタイムは、アンマネージ メモリ内のオブジェクトのメンバに対して適切なレイアウトを自動的に選択します。この列挙体メンバで定義されたオブジェクトは、マネージ コードの外に公開できません。公開しようとすると、例外が生成されます。 |
Explicit
.NET Compact Framework でもサポート。 |
アンマネージ メモリ内にあるオブジェクトの各メンバの正確な位置は、明示的に制御されます。各メンバは FieldOffsetAttribute を使用して、その型内のフィールドの位置を指定する必要があります。 |
Sequential
.NET Compact Framework でもサポート。 |
オブジェクトのメンバは、アンマネージ メモリにエクスポートするときに表示される順番に従ってレイアウトされます。メンバは、 StructLayoutAttribute.Pack で指定したパッキングに従ってレイアウトされます。メンバは非連続にできます。 |
使用例
[Visual Basic, C#, C++] PtInRect 関数のマネージ宣言の例を次に示します。この関数は、特定の点が四角形内に存在するかどうかを確認し、 Point 構造体を Sequential レイアウトで定義し、 Rect 構造体を Explicit レイアウトを定義します。
Enum Bool
[False] = 0
[True]
End Enum 'Bool
<StructLayout(LayoutKind.Sequential)> _
Public Structure Point
Public x As Integer
Public y As Integer
End Structure 'Point
<StructLayout(LayoutKind.Explicit)> _
Public Structure Rect
<FieldOffset(0)> Public left As Integer
<FieldOffset(4)> Public top As Integer
<FieldOffset(8)> Public right As Integer
<FieldOffset(12)> Public bottom As Integer
End Structure 'Rect
Class LibWrapper
<DllImport("user32.dll", CallingConvention := CallingConvention.StdCall)> _
Public Shared Function PtInRect(ByRef r As Rect, p As Point) As Bool
End Function
End Class 'LibWrapper
Class TestApplication
Public Shared Sub Main()
Try
Dim bPointInRect As Bool = 0
Dim myRect As New Rect()
myRect.left = 10
myRect.right = 100
myRect.top = 10
myRect.bottom = 100
Dim myPoint As New Point()
myPoint.x = 50
myPoint.y = 50
bPointInRect = LibWrapper.PtInRect(myRect, myPoint)
If bPointInRect = Bool.True Then
Console.WriteLine("Point lies within the Rect")
Else
Console.WriteLine("Point did not lies within the Rect")
End If
Catch e As Exception
Console.WriteLine(("Exception : " + e.Message.ToString()))
End Try
End Sub 'Main
End Class 'TestApplication
[C#]
enum Bool
{
False = 0,
True
};
[StructLayout(LayoutKind.Sequential)]
public struct Point
{
public int x;
public int y;
}
[StructLayout(LayoutKind.Explicit)]
public struct Rect
{
[FieldOffset(0)] public int left;
[FieldOffset(4)] public int top;
[FieldOffset(8)] public int right;
[FieldOffset(12)] public int bottom;
}
class LibWrapper
{
[DllImport("user32.dll", CallingConvention=CallingConvention.StdCall)]
public static extern Bool PtInRect(ref Rect r, Point p);
};
class TestApplication
{
public static void Main()
{
try
{
Bool bPointInRect = 0;
Rect myRect = new Rect();
myRect.left = 10;
myRect.right = 100;
myRect.top = 10;
myRect.bottom = 100;
Point myPoint = new Point();
myPoint.x = 50;
myPoint.y = 50;
bPointInRect = LibWrapper.PtInRect(ref myRect, myPoint);
if(bPointInRect == Bool.True)
Console.WriteLine("Point lies within the Rect");
else
Console.WriteLine("Point did not lies within the Rect");
}
catch(Exception e)
{
Console.WriteLine("Exception : " + e.Message);
}
}
}
[C++]
__value enum Bool {
False = 0,
True
};
[StructLayout(LayoutKind::Sequential)]
__value struct Point {
public:
int x;
public:
int y;
};
[StructLayout(LayoutKind::Explicit)]
__value struct Rect {
public:
[FieldOffset(0)]
int left;
[FieldOffset(4)]
int top;
[FieldOffset(8)]
int right;
[FieldOffset(12)]
int bottom;
};
__gc class LibWrapper {
public:
[DllImport(S"user32.dll", CallingConvention=CallingConvention::StdCall)]
static Bool PtInRect(Rect* r, Point p);
};
int main() {
try {
Bool bPointInRect = (Bool)0;
Rect myRect = Rect();
myRect.left = 10;
myRect.right = 100;
myRect.top = 10;
myRect.bottom = 100;
Point myPoint = Point();
myPoint.x = 50;
myPoint.y = 50;
bPointInRect = LibWrapper::PtInRect(&myRect, myPoint);
if (bPointInRect == Bool::True)
Console::WriteLine(S"Point lies within the Rect");
else
Console::WriteLine(S"Point did not lie within the Rect");
} catch (Exception* e) {
Console::WriteLine(S"Exception : {0}", e->Message);
}
}
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
名前空間: System.Runtime.InteropServices
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET
アセンブリ: Mscorlib (Mscorlib.dll 内)