StructLayoutAttribute Classe
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Permite controlar o layout físico dos campos de dados de uma classe ou estrutura na memória.
public ref class StructLayoutAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct, Inherited=false)]
public sealed class StructLayoutAttribute : Attribute
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct, Inherited=false)]
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class StructLayoutAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct, Inherited=false)>]
type StructLayoutAttribute = class
inherit Attribute
[<System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct, Inherited=false)>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type StructLayoutAttribute = class
inherit Attribute
Public NotInheritable Class StructLayoutAttribute
Inherits Attribute
- Herança
- 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.
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 NativeMethods
{
public:
[DllImport("kernel32.dll")]
static void GetSystemTime( MySystemTime * st );
};
int main()
{
try
{
MySystemTime sysTime;
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 : {0}", e->Message );
}
catch ( Exception^ e )
{
Console::WriteLine( "Exception : {0}", e->Message );
}
}
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);
}
}
}
}
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
Friend Class NativeMethods
<DllImport("kernel32.dll")> _
Friend Shared Sub GetSystemTime(<MarshalAs(UnmanagedType.LPStruct)> ByVal st As MySystemTime)
End Sub
End Class
Class TestApplication
Public Shared Sub Main()
Try
Dim sysTime As 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 e As TypeLoadException
Console.WriteLine(("TypeLoadException : " + e.Message.ToString()))
Catch e As Exception
Console.WriteLine(("Exception : " + e.Message.ToString()))
End Try
End Sub
End Class
End Namespace 'InteropSample
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 |
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) |