Lire en anglais

Partager via


StructLayoutAttribute Classe

Définition

Vous permet de contrôler la disposition physique des champs de données d'une classe ou d'une structure en mémoire.

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
Héritage
StructLayoutAttribute
Attributs

Exemples

L’exemple suivant illustre une déclaration managée de la fonction et définit MySystemTime la GetSystemTime classe avec LayoutKind.Explicit disposition. GetSystemTime obtient l’heure système et s’imprime sur la 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);
         }
      }
   }
}

Remarques

Vous pouvez appliquer cet attribut à des classes ou des structures.

Le Common Language Runtime contrôle la disposition physique des champs de données d’une classe ou d’une structure dans la mémoire managée. Toutefois, si vous souhaitez passer le type au code non managé, vous pouvez utiliser l’attribut StructLayoutAttribute pour contrôler la disposition non managée du type. Utilisez l’attribut avec LayoutKind.Sequential pour forcer les membres à être disposés séquentiellement dans l’ordre dans lequel ils apparaissent. Pour les types blittables, LayoutKind.Sequential contrôle à la fois la disposition en mémoire managée et la disposition dans la mémoire non managée. Pour les types non blittables, il contrôle la disposition lorsque la classe ou la structure est marshalée en code non managé, mais ne contrôle pas la disposition dans la mémoire managée. Utilisez l’attribut avec LayoutKind.Explicit pour contrôler la position précise de chaque membre de données. Cela affecte à la fois la disposition managée et non managée, pour les types blittable et non blittable. L’utilisation LayoutKind.Explicit nécessite l’utilisation de l’attribut FieldOffsetAttribute pour indiquer la position de chaque champ dans le type.

Les compilateurs C#, Visual Basic et C++ appliquent la valeur de disposition Sequential aux structures par défaut. Pour les classes, vous devez appliquer la LayoutKind.Sequential valeur explicitement. Tlbimp.exe (importateur de bibliothèque de types) applique également l’attribut StructLayoutAttribute ; il applique toujours la LayoutKind.Sequential valeur lorsqu’il importe une bibliothèque de types.

Constructeurs

StructLayoutAttribute(Int16)

Initialise une nouvelle instance de la classe StructLayoutAttribute avec le membre de l'énumération LayoutKind spécifié.

StructLayoutAttribute(LayoutKind)

Initialise une nouvelle instance de la classe StructLayoutAttribute avec le membre de l'énumération LayoutKind spécifié.

Champs

CharSet

Indique si les champs de données de type chaîne de la classe doivent être marshalés en tant que LPWSTR ou LPSTR par défaut.

Pack

Contrôle l'alignement des champs de données d'une classe ou d'une structure en mémoire.

Size

Indique la taille absolue de la classe ou la structure.

Propriétés

TypeId

Lors de l'implémentation dans une classe dérivée, obtient un identificateur unique pour l'objet Attribute.

(Hérité de Attribute)
Value

Obtient la valeur LayoutKind qui spécifie la façon dont la classe ou la structure est disposée.

Méthodes

Equals(Object)

Retourne une valeur qui indique si cette instance est égale à un objet spécifié.

(Hérité de Attribute)
GetHashCode()

Retourne le code de hachage de cette instance.

(Hérité de Attribute)
GetType()

Obtient le Type de l'instance actuelle.

(Hérité de Object)
IsDefaultAttribute()

En cas de substitution dans une classe dérivée, indique si la valeur de cette instance est la valeur par défaut pour la classe dérivée.

(Hérité de Attribute)
Match(Object)

En cas de substitution dans une classe dérivée, retourne une valeur indiquant si cette instance équivaut à un objet spécifié.

(Hérité de Attribute)
MemberwiseClone()

Crée une copie superficielle du Object actuel.

(Hérité de Object)
ToString()

Retourne une chaîne qui représente l'objet actuel.

(Hérité de Object)

Implémentations d’interfaces explicites

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

Mappe un jeu de noms avec un jeu correspondant d'identificateurs de dispatch.

(Hérité de Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Récupère les informations de type pour un objet, qui peuvent être utilisées pour obtenir les informations de type d'une interface.

(Hérité de Attribute)
_Attribute.GetTypeInfoCount(UInt32)

Récupère le nombre d'interfaces d'informations de type fourni par un objet (0 ou 1).

(Hérité de Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Fournit l'accès aux propriétés et aux méthodes exposées par un objet.

(Hérité de Attribute)

S’applique à

Produit Versions
.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

Voir aussi