StructLayoutAttribute Classe

Definizione

Consente di controllare il layout fisico dei campi dati di una classe o una struttura in memoria.

C#
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct, Inherited=false)]
public sealed class StructLayoutAttribute : Attribute
C#
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct, Inherited=false)]
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class StructLayoutAttribute : Attribute
Ereditarietà
StructLayoutAttribute
Attributi

Esempio

Nell'esempio GetSystemTime seguente viene illustrata una dichiarazione gestita della funzione e viene definita MySystemTime la classe con LayoutKind.Explicit il layout. GetSystemTime ottiene l'ora di sistema e stampa nella console.

C#
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;
   }

   internal static class NativeMethods
   {
      [DllImport("kernel32.dll")]
      internal static extern void GetSystemTime([MarshalAs(UnmanagedType.LPStruct)]MySystemTime st);
   };

   class TestApplication
   {
      public static void Main()
      {
         try
         {
            MySystemTime sysTime = new MySystemTime();
            NativeMethods.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);
         }
      }
   }
}

Commenti

È possibile applicare questo attributo alle classi o alle strutture.

Common Language Runtime controlla il layout fisico dei campi dati di una classe o di una struttura in memoria gestita. Tuttavia, se si vuole passare il tipo al codice non gestito, è possibile usare l'attributo per controllare il StructLayoutAttribute layout non gestito del tipo. Usare l'attributo con LayoutKind.Sequential per forzare la disposizione sequenziale dei membri nell'ordine in cui vengono visualizzati. Per i tipi blittable, LayoutKind.Sequential controlla sia il layout in memoria gestita che il layout in memoria non gestita. Per i tipi non blittable, controlla il layout quando la classe o la struttura viene eseguito il marshalling del codice non gestito, ma non controlla il layout in memoria gestita. Usare l'attributo con LayoutKind.Explicit per controllare la posizione precisa di ogni membro dati. Ciò influisce sia sul layout gestito che non gestito, sia per i tipi blittable che non blittable. L'uso LayoutKind.Explicit richiede l'uso dell'attributo FieldOffsetAttribute per indicare la posizione di ogni campo all'interno del tipo.

I compilatori C#, Visual Basic e C++ applicano il valore di Sequential layout alle strutture per impostazione predefinita. Per le classi, è necessario applicare in modo esplicito il LayoutKind.Sequential valore. Tlbimp.exe (Importazione libreria di tipi) applica anche l'attributo; applica sempre il StructLayoutAttributeLayoutKind.Sequential valore quando importa una libreria di tipi.

Costruttori

StructLayoutAttribute(Int16)

Inizializza una nuova istanza della classe StructLayoutAttribute con il membro di enumerazione LayoutKind specificato.

StructLayoutAttribute(LayoutKind)

Inizializza una nuova istanza della classe StructLayoutAttribute con il membro di enumerazione LayoutKind specificato.

Campi

CharSet

Indica se effettuare il marshalling dei campi dati di stringa all'interno della classe come LPWSTR o LPSTR per impostazione predefinita.

Pack

Controlla l'allineamento dei campi dati di una classe o una struttura nella memoria.

Size

Indica le dimensioni assolute della classe o della struttura.

Proprietà

TypeId

Quando è implementata in una classe derivata, ottiene un identificatore univoco della classe Attribute.

(Ereditato da Attribute)
Value

Ottiene il valore LayoutKind che specifica come è disposta la classe o la struttura.

Metodi

Equals(Object)

Restituisce un valore che indica se questa istanza è uguale a un oggetto specificato.

(Ereditato da Attribute)
GetHashCode()

Restituisce il codice hash per l'istanza.

(Ereditato da Attribute)
GetType()

Ottiene l'oggetto Type dell'istanza corrente.

(Ereditato da Object)
IsDefaultAttribute()

In caso di override in una classe derivata, indica se il valore di questa istanza è il valore predefinito per la classe derivata.

(Ereditato da Attribute)
Match(Object)

Quando è sottoposto a override in una classe derivata, restituisce un valore che indica se questa istanza equivale a un oggetto specificato.

(Ereditato da Attribute)
MemberwiseClone()

Crea una copia superficiale dell'oggetto Object corrente.

(Ereditato da Object)
ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.

(Ereditato da Object)

Implementazioni dell'interfaccia esplicita

_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

Esegue il mapping di un set di nomi a un set corrispondente di ID dispatch.

(Ereditato da Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Recupera le informazioni sul tipo relative a un oggetto, che possono essere usate per ottenere informazioni sul tipo relative a un'interfaccia.

(Ereditato da Attribute)
_Attribute.GetTypeInfoCount(UInt32)

Recupera il numero delle interfacce di informazioni sul tipo fornite da un oggetto (0 o 1).

(Ereditato da Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Fornisce l'accesso a proprietà e metodi esposti da un oggetto.

(Ereditato da Attribute)

Si applica a

Prodotto Versioni
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Vedi anche