LayoutKind-Enumeration
Veröffentlicht: Oktober 2016
Steuert das Layout eines Objekts beim Exportieren in nicht verwalteten Code.
Namespace: System.Runtime.InteropServices
Assembly: mscorlib (in mscorlib.dll)
Syntax
[SerializableAttribute]
[ComVisibleAttribute(true)]
public enum LayoutKind
[SerializableAttribute]
[ComVisibleAttribute(true)]
public enum class LayoutKind
[<SerializableAttribute>]
[<ComVisibleAttribute(true)>]
type LayoutKind
<SerializableAttribute>
<ComVisibleAttribute(True)>
Public Enumeration LayoutKind
Member
Membername | Beschreibung | |
---|---|---|
Auto | Automatisch wählt die Laufzeit ein entsprechende Layout für die Member eines Objekts in nicht verwalteten Speicher. Mit diesem Enumerationsmember definierten Objekte können nicht außerhalb von verwaltetem Code verfügbar gemacht werden. Versuch wird eine Ausnahme generiert. |
|
Explicit | Die genaue Position der einzelnen Member eines Objekts in nicht verwaltetem Speicher explizit gesteuert wird, gemäß der Einstellung der StructLayoutAttribute.Pack Feld. Jedes Member verwenden, muss die FieldOffsetAttribute auf die Position dieses Felds im Typ anzugeben. |
|
Sequential | Die Member des Objekts werden sequenziell in der Reihenfolge angeordnet, in denen sie angezeigt, beim Exportieren in nicht verwalteten Speicher werden. Die Elemente im angegebenen angelegt StructLayoutAttribute.Pack, nicht zusammenhängende möglich. |
Hinweise
Diese Enumeration wird zusammen mit StructLayoutAttribute. Die common Language Runtime verwendet die Auto standardmäßig Layoutwert. Zum Reduzieren der Layout-bezogene Probleme im Zusammenhang mit der Auto -Wert, c#, Visual Basic und C++-Compiler geben Sequential Layout für Werttypen.
Wichtig
Die StructLayoutAttribute.Pack Feld steuert die Ausrichtung der Datenfelder und wirkt sich daher auf das Layout unabhängig von der LayoutKind von Ihnen angegebene Wert. Standardmäßig wird der Wert der Pack ist 0, womit die Standardkomprimierungsgröße für die aktuelle Plattform. Z. B. bei Verwendung der Explicit Layout Wert und geben Sie die Ausrichtungen Feld auf Byte-Grenzen, müssen Sie festlegen Pack auf 1 fest, um das gewünschte Ergebnis zu erhalten.
Beispiele
Das folgende Beispiel zeigt die verwaltete Deklaration der PtInRect -Funktion, die überprüft, ob ein Punkt innerhalb eines Rechtecks befindet, und definiert einen Point Struktur mit Sequential Layout und ein Rect Struktur mit Explicit Layout.
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 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
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
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 lie within the Rect")
End If
Catch e As Exception
Console.WriteLine(("Exception : " + e.Message.ToString()))
End Try
End Sub
End Class
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 LibWrapper
{
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 = LibWrapper::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 );
}
}
Versionsinformationen
Universelle Windows-Plattform
Verfügbar seit 8
.NET Framework
Verfügbar seit 1.1
Portierbare Klassenbibliothek
Unterstützt in: portierbare .NET-Plattformen
Silverlight
Verfügbar seit 2.0
Windows Phone Silverlight
Verfügbar seit 7.0
Windows Phone
Verfügbar seit 8.1
Siehe auch
System.Runtime.InteropServices-Namespace
Zurück zum Anfang