StructLayoutAttribute-Klasse
Veröffentlicht: Oktober 2016
Hiermit können Sie das physikalische Layout der Datenfelder einer Klasse oder Struktur im Speicher steuern.
Namespace: System.Runtime.InteropServices
Assembly: mscorlib (in mscorlib.dll)
Vererbungshierarchie
System.Object
System.Attribute
System.Runtime.InteropServices.StructLayoutAttribute
Syntax
[AttributeUsageAttribute(AttributeTargets.Class | AttributeTargets.Struct,
Inherited = false)]
[ComVisibleAttribute(true)]
public sealed class StructLayoutAttribute : Attribute
[AttributeUsageAttribute(AttributeTargets::Class | AttributeTargets::Struct,
Inherited = false)]
[ComVisibleAttribute(true)]
public ref class StructLayoutAttribute sealed : Attribute
[<Sealed>]
[<AttributeUsageAttribute(AttributeTargets.Class | AttributeTargets.Struct,
Inherited = false)>]
[<ComVisibleAttribute(true)>]
type StructLayoutAttribute =
class
inherit Attribute
end
<AttributeUsageAttribute(AttributeTargets.Class Or AttributeTargets.Struct,
Inherited := False)>
<ComVisibleAttribute(True)>
Public NotInheritable Class StructLayoutAttribute
Inherits Attribute
Konstruktoren
Name | Beschreibung | |
---|---|---|
StructLayoutAttribute(Int16) | Initialisiert eine neue Instanz der StructLayoutAttribute-Klasse mit dem angegebenen System.Runtime.InteropServices.LayoutKind-Enumerationsmember. |
|
StructLayoutAttribute(LayoutKind) | Initialisiert eine neue Instanz der StructLayoutAttribute-Klasse mit dem angegebenen System.Runtime.InteropServices.LayoutKind-Enumerationsmember. |
Eigenschaften
Name | Beschreibung | |
---|---|---|
TypeId | Ruft bei Implementierung in einer abgeleiteten Klasse einen eindeutigen Bezeichner für dieses Attribute ab.(Geerbt von „Attribute“.) |
|
Value | Ruft den LayoutKind-Wert ab, der angibt, wie die Klasse oder Struktur angeordnet ist. |
Methoden
Name | Beschreibung | |
---|---|---|
Equals(Object) | Diese API unterstützt die Produkt Infrastruktur und sollte nicht direkt aus dem Code verwendet werden. Gibt einen Wert zurück, der angibt, ob diese Instanz gleich einem angegebenen Objekt ist.(Geerbt von „Attribute“.) |
|
GetHashCode() | Gibt den Hashcode für diese Instanz zurück.(Geerbt von „Attribute“.) |
|
GetType() | Ruft den Type der aktuellen Instanz ab.(Geerbt von „Object“.) |
|
IsDefaultAttribute() | Gibt beim Überschreiben in einer abgeleiteten Klasse an, ob der Wert der Instanz der Standardwert für die abgeleitete Klasse ist.(Geerbt von „Attribute“.) |
|
Match(Object) | Ruft beim Überschreiben in einer abgeleiteten Klasse gibt einen Wert, der angibt, ob diese Instanz gleich ein angegebenen Objekt ist.(Geerbt von „Attribute“.) |
|
ToString() | Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.(Geerbt von „Object“.) |
Felder
Name | Beschreibung | |
---|---|---|
CharSet | Gibt an, ob Zeichenfolgendatenfelder in der Klasse standardmäßig als LPWSTR oder als LPSTR gemarshallt werden müssen. |
|
Pack | Steuert die Ausrichtung der Datenfelder einer Klasse oder Struktur im Speicher. |
|
Size | Gibt die absolute Größe der Klasse oder Struktur an. |
Explizite Schnittstellenimplementierungen
Name | Beschreibung | |
---|---|---|
_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) | Ordnet eine Reihe von Namen einer entsprechenden Reihe von Dispatchbezeichnern zu.(Geerbt von „Attribute“.) |
|
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) | Ruft die Typinformationen für ein Objekt ab, mit deren Hilfe die Typinformationen für eine Schnittstelle abgerufen werden können.(Geerbt von „Attribute“.) |
|
_Attribute.GetTypeInfoCount(UInt32) | Ruft die Anzahl der Schnittstellen mit Typinformationen ab, die von einem Objekt bereitgestellt werden (0 oder 1).(Geerbt von „Attribute“.) |
|
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) | Stellt den Zugriff auf von einem Objekt verfügbar gemachte Eigenschaften und Methoden bereit.(Geerbt von „Attribute“.) |
Hinweise
Dieses Attribut kann auf Klassen oder Strukturen angewendet werden.
Die common Language Runtime steuert das physische Layout der Datenfelder einer Klasse oder Struktur im verwalteten Speicher. Wenn Sie den nicht verwalteten Code übergeben möchten, Sie können jedoch die StructLayoutAttribute Attribut, das nicht verwaltete Layout des Typs steuern. Das Attribut mit LayoutKind.Sequential die Member sequenziell in der Reihenfolge angeordnet werden, sie angezeigt werden. Für LayoutKind.Sequential steuert des Layouts im verwalteten Speicher und das Layout im nicht verwalteten Speicher. Für nicht blitfähige Typen steuert er das Layout, wenn die Klasse oder Struktur an nicht verwalteten Code gemarshallt wird, steuert jedoch nicht das Layout im verwalteten Speicher. Das Attribut mit LayoutKind.Explicit die genaue Position der einzelnen Datenmember steuert. Dies betrifft sowohl verwaltete als auch nicht verwaltete Layout für blitfähige und nicht blitfähige Typen. Mithilfe von LayoutKind.Explicit erfordert die Verwendung der FieldOffsetAttribute Attribut, um die Position jedes Felds innerhalb des Typs anzugeben.
Anwenden von c#, Visual Basic und C++-Compiler die Sequential Layoutwert standardmäßig auf Strukturen. Für Klassen, gilt die LayoutKind.Sequential -Wert explizit. Die Tlbimp.exe (Type Library Importer) gilt auch für die StructLayoutAttribute -Attribut; es gilt immer die LayoutKind.Sequential Wert beim Importieren einer Typbibliothek.
Beispiele
Das folgende Beispiel veranschaulicht eine verwaltete Deklaration der GetSystemTime -Funktion und definiert MySystemTime -Klasse mit LayoutKind.Explicit Layout.GetSystemTime Ruft die Systemzeit ab und wird in der Konsole.
using System;
using System.Runtime.InteropServices;
namespace InteropSample
{
[StructLayout(LayoutKind.Explicit, Size=16, CharSet=CharSet.Ansi)]
public class MySystemTime
{
[FieldOffset(0)]public ushort wYear;
[FieldOffset(2)]public ushort wMonth;
[FieldOffset(4)]public ushort wDayOfWeek;
[FieldOffset(6)]public ushort wDay;
[FieldOffset(8)]public ushort wHour;
[FieldOffset(10)]public ushort wMinute;
[FieldOffset(12)]public ushort wSecond;
[FieldOffset(14)]public ushort wMilliseconds;
}
class LibWrapper
{
[DllImport("kernel32.dll")]
public static extern void GetSystemTime([MarshalAs(UnmanagedType.LPStruct)]MySystemTime st);
};
class TestApplication
{
public static void Main()
{
try
{
MySystemTime sysTime = new MySystemTime();
LibWrapper.GetSystemTime(sysTime);
Console.WriteLine("The System time is {0}/{1}/{2} {3}:{4}:{5}", sysTime.wDay,
sysTime.wMonth, sysTime.wYear, sysTime.wHour, sysTime.wMinute, sysTime.wSecond);
}
catch(TypeLoadException e)
{
Console.WriteLine("TypeLoadException : " + e.Message);
}
catch(Exception e)
{
Console.WriteLine("Exception : " + e.Message);
}
}
}
}
Imports System
Imports System.Runtime.InteropServices
Namespace InteropSample
<StructLayout(LayoutKind.Explicit, Size:=16, CharSet:=CharSet.Ansi)> _
Public Class MySystemTime
<FieldOffset(0)> Public wYear As Short
<FieldOffset(2)> Public wMonth As Short
<FieldOffset(4)> Public wDayOfWeek As Short
<FieldOffset(6)> Public wDay As Short
<FieldOffset(8)> Public wHour As Short
<FieldOffset(10)> Public wMinute As Short
<FieldOffset(12)> Public wSecond As Short
<FieldOffset(14)> Public wMilliseconds As Short
End Class 'MySystemTime
Class LibWrapper
<DllImport("kernel32.dll")> _
Public Shared Sub GetSystemTime(<MarshalAs(UnmanagedType.LPStruct)> ByVal st As MySystemTime)
End Sub
End Class 'LibWrapper
Class TestApplication
Public Shared Sub Main()
Try
Dim sysTime As New MySystemTime()
LibWrapper.GetSystemTime(sysTime)
Console.WriteLine("The System time is {0}/{1}/{2} {3}:{4}:{5}", sysTime.wDay, sysTime.wMonth, sysTime.wYear, sysTime.wHour, sysTime.wMinute, sysTime.wSecond)
Catch e As TypeLoadException
Console.WriteLine(("TypeLoadException : " + e.Message.ToString()))
Catch e As Exception
Console.WriteLine(("Exception : " + e.Message.ToString()))
End Try
End Sub 'Main
End Class 'TestApplication
End Namespace 'InteropSample
using namespace System;
using namespace System::Runtime::InteropServices;
[StructLayout(LayoutKind::Explicit,Size=16,CharSet=CharSet::Ansi)]
value class MySystemTime
{
public:
[FieldOffset(0)]
short wYear;
[FieldOffset(2)]
short wMonth;
[FieldOffset(4)]
short wDayOfWeek;
[FieldOffset(6)]
short wDay;
[FieldOffset(8)]
short wHour;
[FieldOffset(10)]
short wMinute;
[FieldOffset(12)]
short wSecond;
[FieldOffset(14)]
short wMilliseconds;
};
ref class LibWrapper
{
public:
[DllImport("kernel32.dll")]
static void GetSystemTime( MySystemTime * st );
};
int main()
{
try
{
MySystemTime sysTime;
LibWrapper::GetSystemTime( &sysTime );
Console::WriteLine( "The System time is {0}/{1}/{2} {3}:{4}:{5}", sysTime.wDay, sysTime.wMonth, sysTime.wYear, sysTime.wHour, sysTime.wMinute, sysTime.wSecond );
}
catch ( TypeLoadException^ e )
{
Console::WriteLine( "TypeLoadException : {0}", e->Message );
}
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
Threadsicherheit
Alle öffentlichen statischen Member ( Shared in Visual Basic) dieses Typs sind threadsicher. Die Threadsicherheit für Instanzmember ist nicht garantiert.
Siehe auch
System.Runtime.InteropServices-Namespace
Tlbimp.exe (Type Library Importer)
Zurück zum Anfang