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 内)

参照

System.Runtime.InteropServices 名前空間