StructLayoutAttribute Classe

Definição

Permite controlar o layout físico dos campos de dados de uma classe ou estrutura na memória.

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
Herança
StructLayoutAttribute
Atributos

Exemplos

O exemplo a seguir demonstra uma declaração gerenciada da função e define MySystemTime a GetSystemTime classe com LayoutKind.Explicit layout. GetSystemTime obtém a hora do sistema e imprime no 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);
         }
      }
   }
}

Comentários

Você pode aplicar esse atributo a classes ou estruturas.

O Common Language Runtime controla o layout físico dos campos de dados de uma classe ou estrutura na memória gerenciada. No entanto, se você quiser passar o tipo para código não gerenciado, poderá usar o StructLayoutAttribute atributo para controlar o layout não gerenciado do tipo. Use o atributo com LayoutKind.Sequential para forçar os membros a serem dispostos sequencialmente na ordem em que aparecem. Para tipos blittable, LayoutKind.Sequential controla o layout na memória gerenciada e o layout na memória não gerenciada. Para tipos não blittable, ele controla o layout quando a classe ou estrutura é empacotada para código não gerenciado, mas não controla o layout na memória gerenciada. Use o atributo com LayoutKind.Explicit para controlar a posição precisa de cada membro de dados. Isso afeta o layout gerenciado e não gerenciado para tipos blittable e não blittable. Usar LayoutKind.Explicit requer que você use o FieldOffsetAttribute atributo para indicar a posição de cada campo dentro do tipo .

Os compiladores C#, Visual Basic e C++ aplicam o valor de Sequential layout a estruturas por padrão. Para classes, você deve aplicar o LayoutKind.Sequential valor explicitamente. Tlbimp.exe (Importador de Biblioteca de Tipos) também aplica o StructLayoutAttribute atributo ; ele sempre aplica o LayoutKind.Sequential valor quando importa uma biblioteca de tipos.

Construtores

StructLayoutAttribute(Int16)

Inicializa uma nova instância da classe StructLayoutAttribute com o membro de enumeração LayoutKind especificado.

StructLayoutAttribute(LayoutKind)

Inicializa uma nova instância da classe StructLayoutAttribute com o membro de enumeração LayoutKind especificado.

Campos

CharSet

Indica se o marshaling dos campos de dados da cadeia de caracteres dentro da classe deve ser realizado como LPWSTR ou LPSTR por padrão.

Pack

Controla o alinhamento dos campos de dados de uma classe ou estrutura na memória.

Size

Indica o tamanho absoluto da classe ou estrutura.

Propriedades

TypeId

Quando implementado em uma classe derivada, obtém um identificador exclusivo para este Attribute.

(Herdado de Attribute)
Value

Obtém o valor LayoutKind que especifica como a classe ou estrutura é organizada.

Métodos

Equals(Object)

Retorna um valor que indica se essa instância é igual a um objeto especificado.

(Herdado de Attribute)
GetHashCode()

Retorna o código hash para a instância.

(Herdado de Attribute)
GetType()

Obtém o Type da instância atual.

(Herdado de Object)
IsDefaultAttribute()

Quando substituído em uma classe derivada, indica se o valor dessa instância é o valor padrão para a classe derivada.

(Herdado de Attribute)
Match(Object)

Quando substituído em uma classe derivada, retorna um valor que indica se essa instância é igual a um objeto especificado.

(Herdado de Attribute)
MemberwiseClone()

Cria uma cópia superficial do Object atual.

(Herdado de Object)
ToString()

Retorna uma cadeia de caracteres que representa o objeto atual.

(Herdado de Object)

Implantações explícitas de interface

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

Mapeia um conjunto de nomes para um conjunto correspondente de identificadores de expedição.

(Herdado de Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Recupera as informações de tipo para um objeto, que pode ser usado para obter as informações de tipo para uma interface.

(Herdado de Attribute)
_Attribute.GetTypeInfoCount(UInt32)

Retorna o número de interfaces de informações do tipo que um objeto fornece (0 ou 1).

(Herdado de Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Fornece acesso a propriedades e métodos expostos por um objeto.

(Herdado de Attribute)

Aplica-se a

Produto Versões
.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

Confira também