Freigeben über


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
System_CAPS_pubmethod StructLayoutAttribute(Int16)

Initialisiert eine neue Instanz der StructLayoutAttribute-Klasse mit dem angegebenen System.Runtime.InteropServices.LayoutKind-Enumerationsmember.

System_CAPS_pubmethod StructLayoutAttribute(LayoutKind)

Initialisiert eine neue Instanz der StructLayoutAttribute-Klasse mit dem angegebenen System.Runtime.InteropServices.LayoutKind-Enumerationsmember.

Eigenschaften

Name Beschreibung
System_CAPS_pubproperty TypeId

Ruft bei Implementierung in einer abgeleiteten Klasse einen eindeutigen Bezeichner für dieses Attribute ab.(Geerbt von „Attribute“.)

System_CAPS_pubproperty Value

Ruft den LayoutKind-Wert ab, der angibt, wie die Klasse oder Struktur angeordnet ist.

Methoden

Name Beschreibung
System_CAPS_pubmethod 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“.)

System_CAPS_pubmethod GetHashCode()

Gibt den Hashcode für diese Instanz zurück.(Geerbt von „Attribute“.)

System_CAPS_pubmethod GetType()

Ruft den Type der aktuellen Instanz ab.(Geerbt von „Object“.)

System_CAPS_pubmethod 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“.)

System_CAPS_pubmethod 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“.)

System_CAPS_pubmethod ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.(Geerbt von „Object“.)

Felder

Name Beschreibung
System_CAPS_pubfield CharSet

Gibt an, ob Zeichenfolgendatenfelder in der Klasse standardmäßig als LPWSTR oder als LPSTR gemarshallt werden müssen.

System_CAPS_pubfield Pack

Steuert die Ausrichtung der Datenfelder einer Klasse oder Struktur im Speicher.

System_CAPS_pubfield Size

Gibt die absolute Größe der Klasse oder Struktur an.

Explizite Schnittstellenimplementierungen

Name Beschreibung
System_CAPS_pubinterfaceSystem_CAPS_privmethod _Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

Ordnet eine Reihe von Namen einer entsprechenden Reihe von Dispatchbezeichnern zu.(Geerbt von „Attribute“.)

System_CAPS_pubinterfaceSystem_CAPS_privmethod _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“.)

System_CAPS_pubinterfaceSystem_CAPS_privmethod _Attribute.GetTypeInfoCount(UInt32)

Ruft die Anzahl der Schnittstellen mit Typinformationen ab, die von einem Objekt bereitgestellt werden (0 oder 1).(Geerbt von „Attribute“.)

System_CAPS_pubinterfaceSystem_CAPS_privmethod _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