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 beim Exportieren in nicht verwalteten Code.
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
Auto | 3 | Für die Member eines Objekts in nicht verwaltetem Speicher wird zur Laufzeit automatisch ein angemessenes Layout ausgewählt. Mit diesem Enumerationsmember definierte Objekte können nicht außerhalb von verwaltetem Code verfügbar gemacht werden. Bei einem entsprechenden Versuch wird eine Ausnahme ausgelöst. |
Explicit | 2 | Die genaue Position der einzelnen Member eines Objekts in nicht verwaltetem Speicher wird explizit gesteuert, entsprechend der Festlegung im Feld Pack. Jedes Member muss das FieldOffsetAttribute verwenden, um die Position dieses Felds innerhalb des Typs anzugeben. |
Sequential | 0 | Das Layout der Member des Objekts erfolgt sequenziell in der Reihenfolge, in der sich diese beim Export in nicht verwalteten Speicher befinden. Das Layout der Member entspricht der in Pack angegebenen Komprimierung, und es darf nicht lückenhaft sein. |
Beispiele
Das folgende Beispiel zeigt die verwaltete Deklaration der PtInRect
Funktion, die überprüft, ob ein Punkt innerhalb eines Rechtecks liegt, und eine Point
Struktur mit sequenziellem Layout und eine Rect
Struktur mit explizitem Layout definiert.
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 Enumeration wird mit StructLayoutAttributeverwendet. Die Common Language Runtime verwendet standardmäßig den Auto
Layoutwert. Um layoutbezogene Probleme im Zusammenhang mit dem Wert zu reduzieren, geben C Auto
#-, Visual Basic- und C++-Compiler das Layout für Werttypen an Sequential
.
Wichtig
Das StructLayoutAttribute.Pack Feld steuert die Ausrichtung von Datenfeldern und wirkt sich somit unabhängig vom angegebenen Wert auf das LayoutKind Layout aus. Standardmäßig ist der Wert von Pack 0, was 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.