LayoutKind Enumeration
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Steuert das Layout eines Objekts, wenn es in nicht verwalteten Code exportiert wird.
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
- Vererbung
- Attribute
Felder
| Name | Wert | Beschreibung |
|---|---|---|
| Sequential | 0 | Die Elemente des Objekts werden sequenziell angeordnet, in der Reihenfolge, in der sie angezeigt werden, wenn sie in nicht verwalteten Speicher exportiert werden. Die Mitglieder sind gemäß der in der Verpackung angegebenen Packund können nicht zusammenhängend sein. |
| Explicit | 2 | Die genaue Position jedes Elements eines Objekts im nicht verwalteten Speicher wird explizit gesteuert, vorbehaltlich der Einstellung des Pack Felds. Jedes Element muss die FieldOffsetAttribute Position dieses Felds innerhalb des Typs angeben. |
| Auto | 3 | Die Laufzeit wählt automatisch ein geeignetes Layout für die Elemente eines Objekts im nicht verwalteten Speicher aus. Objekte, die mit diesem Enumerationselement definiert sind, können nicht außerhalb von verwaltetem Code verfügbar gemacht werden. Wenn Sie versuchen, dies zu tun, wird eine Ausnahme generiert. |
Beispiele
Das folgende Beispiel zeigt die verwaltete Deklaration der PtInRect Funktion, die überprüft, ob ein Punkt innerhalb eines Rechtecks liegt, und definiert eine Point Struktur mit sequenziellem Layout und einer Rect Struktur mit explizitem 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 Class
Hinweise
Diese Aufzählung wird mit StructLayoutAttribute. Die Common Language Runtime verwendet standardmäßig den Auto Layoutwert. Um layoutbezogene Probleme im Zusammenhang mit dem wert Auto, C#, Visual Basic und C++-Compilern zu verringern, geben Sie Sequential Layout für Werttypen an.
Wichtig
Das StructLayoutAttribute.Pack Feld steuert die Ausrichtung von Datenfeldern und wirkt sich somit unabhängig vom LayoutKind von Ihnen angegebenen Wert auf das Layout aus. Standardmäßig ist der Wert Pack 0, der die Standardverpackungsgröße für die aktuelle Plattform angibt. Wenn Sie beispielsweise den Explicit Layoutwert verwenden und Feldausrichtungen an Bytegrenzen angeben, müssen Sie auf 1 festlegen Pack , um das gewünschte Ergebnis zu erhalten.