LayoutKind 列挙型
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
アンマネージ コードにエクスポートするときにオブジェクトのレイアウトを制御します。
public enum class LayoutKind
public enum LayoutKind
[System.Serializable]
public enum LayoutKind
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public enum LayoutKind
type LayoutKind =
[<System.Serializable>]
type LayoutKind =
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type LayoutKind =
Public Enum LayoutKind
- 継承
- 属性
フィールド
Auto | 3 | ランタイムは、アンマネージ メモリ内のオブジェクトのメンバーに対して適切なレイアウトを自動的に選択します。 この列挙体メンバーで定義されたオブジェクトは、マネージド コードの外に公開できません。 公開しようとすると、例外が生成されます。 |
Explicit | 2 | アンマネージ メモリ内にあるオブジェクトの各メンバーの正確な位置は、Pack フィールドの設定によって明示的に制御されます。 各メンバーは FieldOffsetAttribute を使用して、その型内のフィールドの位置を指定する必要があります。 |
Sequential | 0 | オブジェクトのメンバーは、アンマネージ メモリにエクスポートするときに表示される順番に従ってレイアウトされます。 メンバーは、Pack で指定したパッキングに従ってレイアウトされます。メンバーは非連続にできます。 |
例
次の例は、 関数のマネージド宣言をPtInRect
示しています。この関数は、ポイントが四角形内にあるかどうかをチェックし、シーケンシャル レイアウトを持つ構造体と、明示的なレイアウトを持つ構造体をRect
定義Point
します。
enum class Bool
{
False = 0,
True
};
[StructLayout(LayoutKind::Sequential)]
value struct Point
{
public:
int x;
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;
};
ref class NativeMethods
{
public:
[DllImport("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 = NativeMethods::PtInRect( &myRect, myPoint );
if ( bPointInRect == Bool::True )
Console::WriteLine( "Point lies within the Rect" );
else
Console::WriteLine( "Point did not lie within the Rect" );
}
catch ( Exception^ e )
{
Console::WriteLine( "Exception : {0}", e->Message );
}
}
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;
}
internal static class NativeMethods
{
[DllImport("user32.dll", CallingConvention=CallingConvention.StdCall)]
internal 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 = NativeMethods.PtInRect(ref myRect, myPoint);
if(bPointInRect == Bool.True)
Console.WriteLine("Point lies within the Rect");
else
Console.WriteLine("Point did not lie within the Rect");
}
catch(Exception e)
{
Console.WriteLine("Exception : " + e.Message);
}
}
}
' The program shows a managed declaration of the PtInRect function and defines Point
' structure with sequential layout and Rect structure with explicit layout. The PtInRect
' checks the point lies within the rectangle or not.
Imports System.Runtime.InteropServices
Enum Bool
[False] = 0
[True]
End Enum
<StructLayout(LayoutKind.Sequential)> _
Public Structure Point
Public x As Integer
Public y As Integer
End Structure
<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
Friend Class NativeMethods
<DllImport("user32.dll", CallingConvention := CallingConvention.StdCall)> _
Friend Shared Function PtInRect(ByRef r As Rect, p As Point) As Bool
End Function
End Class
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 = NativeMethods.PtInRect(myRect, myPoint)
If bPointInRect = Bool.True Then
Console.WriteLine("Point lies within the Rect")
Else
Console.WriteLine("Point did not lie within the Rect")
End If
Catch e As Exception
Console.WriteLine(("Exception : " + e.Message.ToString()))
End Try
End Sub
End Class
注釈
この列挙は と共に StructLayoutAttribute使用されます。 共通言語ランタイムでは、既定でレイアウト値が Auto
使用されます。 値に関連するレイアウト関連の問題を Auto
減らすために、C#、Visual Basic、C++ コンパイラは値型のレイアウトを指定 Sequential
します。
重要
フィールドは StructLayoutAttribute.Pack データ フィールドの配置を制御するため、指定した値に関係なくレイアウトに LayoutKind 影響します。 既定では、 の Pack 値は 0 で、現在のプラットフォームの既定のパッキング サイズを示します。 たとえば、レイアウト値を Explicit
使用し、バイト境界でフィールドの配置を指定する場合、目的の結果を取得するには 1 に設定 Pack する必要があります。
適用対象
.NET