LayoutKind Wyliczenie

Definicja

Steruje układem obiektu podczas eksportowania do niezarządzanego kodu.

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
Dziedziczenie
LayoutKind
Atrybuty

Pola

Auto 3

Środowisko uruchomieniowe automatycznie wybiera odpowiedni układ dla elementów członkowskich obiektu w pamięci niezarządzanej. Nie można uwidocznić obiektów zdefiniowanych za pomocą tego elementu członkowskiego wyliczenia poza kodem zarządzanym. Próba wykonania tej czynności powoduje wygenerowanie wyjątku.

Explicit 2

Dokładne położenie każdego elementu członkowskiego obiektu w pamięci niezarządzanej jest jawnie kontrolowane, z zastrzeżeniem ustawienia Pack pola. Każdy element członkowski musi użyć elementu FieldOffsetAttribute , aby wskazać położenie tego pola w typie.

Sequential 0

Elementy członkowskie obiektu są rozmieszczone sekwencyjnie, w kolejności, w której są wyświetlane podczas eksportowania do niezarządzanej pamięci. Składowe są określone zgodnie z opakowaniem określonym w Pack, i mogą być niekontencyjne.

Przykłady

W poniższym przykładzie pokazano zarządzaną deklarację PtInRect funkcji, która sprawdza, czy punkt znajduje się w prostokątze, i definiuje Point strukturę z układem sekwencyjnym i Rect strukturą z układem jawnym.

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

Uwagi

Ta wyliczenie jest używana z elementem StructLayoutAttribute. Środowisko uruchomieniowe języka wspólnego domyślnie używa Auto wartości układu. Aby zmniejszyć problemy związane z układem skojarzone z wartością Auto , kompilatory języka C#, Visual Basic i C++ określają Sequential układ typów wartości.

Ważne

Pole StructLayoutAttribute.Pack kontroluje wyrównanie pól danych, a tym samym wpływa na układ niezależnie od LayoutKind określonej wartości. Domyślnie wartość to Pack 0, która wskazuje domyślny rozmiar pakowania dla bieżącej platformy. Na przykład w przypadku użycia Explicit wartości układu i określenia wyrównań pól na granicach bajtów należy ustawić Pack wartość 1, aby uzyskać żądany wynik.

Dotyczy