This browser is no longer supported.
Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.
Note
Access to this page requires authorization. You can trysigning in orchanging directories.
Access to this page requires authorization. You can trychanging directories.
Important
Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.
Controls the layout of an object when exported to unmanaged code.
public enum class LayoutKindpublic enum LayoutKind[System.Serializable]public enum LayoutKind[System.Serializable][System.Runtime.InteropServices.ComVisible(true)]public enum LayoutKindtype LayoutKind =[<System.Serializable>]type LayoutKind =[<System.Serializable>][<System.Runtime.InteropServices.ComVisible(true)>]type LayoutKind =Public Enum LayoutKind| Name | Value | Description |
|---|---|---|
| Sequential | 0 | The members of the object are laid out sequentially, in the order in which they appear when exported to unmanaged memory. The members are laid out according to the packing specified inPack, and can be noncontiguous. |
| Explicit | 2 | The precise position of each member of an object in unmanaged memory is explicitly controlled, subject to the setting of thePack field. Each member must use theFieldOffsetAttribute to indicate the position of that field within the type. |
| Auto | 3 | The runtime automatically chooses an appropriate layout for the members of an object in unmanaged memory. Objects defined with this enumeration member cannot be exposed outside of managed code. Attempting to do so generates an exception. |
The following example shows the managed declaration of thePtInRect function, which checks whether a point lies within a rectangle, and defines aPoint structure with Sequential layout and aRect structure with Explicit layout.
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 ClassThis enumeration is used withStructLayoutAttribute. The common language runtime uses theAuto layout value by default. To reduce layout-related problems associated with theAuto value, C#, Visual Basic, and C++ compilers specifySequential layout for value types.
Important
TheStructLayoutAttribute.Pack field controls the alignment of data fields, and thus affects the layout regardless of theLayoutKind value you specify. By default, the value ofPack is 0, which indicates the default packing size for the current platform. For example, when you use theExplicit layout value and specify field alignments on byte boundaries, you must setPack to 1 to get the desired result.
Was this page helpful?
Need help with this topic?
Want to try using Ask Learn to clarify or guide you through this topic?
Was this page helpful?
Want to try using Ask Learn to clarify or guide you through this topic?