LayoutKind 列挙型

定義

アンマネージ コードにエクスポートするときにオブジェクトのレイアウトを制御します。

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
継承
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 する必要があります。

適用対象