Classe StructLayoutAttribute
Dica
The .NET API Reference documentation has a new home. Visit the .NET API Browser on docs.microsoft.com to see the new experience.
Permite controlar o layout físico dos campos de dados de uma classe ou estrutura na memória.
Namespace: System.Runtime.InteropServices
Assembly: mscorlib (em mscorlib.dll)
Hierarquia de Herança
System.Object
System.Attribute
System.Runtime.InteropServices.StructLayoutAttribute
Sintaxe
[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
Construtores
Nome | Descrição | |
---|---|---|
StructLayoutAttribute(Int16) | Inicializa uma nova instância da classe StructLayoutAttribute com o membro de enumeração System.Runtime.InteropServices.LayoutKind especificado. |
|
StructLayoutAttribute(LayoutKind) | Inicializa uma nova instância da classe StructLayoutAttribute com o membro de enumeração System.Runtime.InteropServices.LayoutKind especificado. |
Propriedades
Nome | Descrição | |
---|---|---|
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
Nome | Descrição | |
---|---|---|
Equals(Object) | Esta API dá suporte à infraestrutura produto e não se destina a ser usada diretamente do seu código. Retorna um valor que indica se essa instância é igual a um objeto especificado.(Herdado de Attribute.) |
|
GetHashCode() | Retorna o código hash para essa instância.(Herdado de Attribute.) |
|
GetType() | ||
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.) |
|
ToString() | Retorna uma cadeia de caracteres que representa o objeto atual.(Herdado de Object.) |
Campos
Nome | Descrição | |
---|---|---|
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. |
Implementações Explícitas da Interface
Nome | Descrição | |
---|---|---|
_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.) |
Comentários
Você pode aplicar esse atributo para 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, você pode usar o StructLayoutAttribute atributo para controlar o layout não gerenciado do tipo. Use o atributo com LayoutKind.Sequential para obrigar os membros a ser dispostos sequencialmente na ordem em que aparecem.LayoutKind.Sequential Controla o layout de memória gerenciada tanto o layout em memória não gerenciada. Para tipos não blittable, ele controla o layout quando a classe ou estrutura passa por marshaling para código não gerenciado, mas não controla o layout de 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 gerenciados, para tipos blittable e não blittable. Usando LayoutKind.Explicit exige que você use o FieldOffsetAttribute atributo para indicar a posição de cada campo dentro do tipo.
Compiladores c#, Visual Basic e C++ se aplicam a Sequential valor de layout para estruturas por padrão. Para classes, você deve aplicar o LayoutKind.Sequential valor explicitamente. O Tlbimp.exe (Importador de Biblioteca de Tipos) também se aplica a StructLayoutAttribute atributo; ele sempre se aplica a LayoutKind.Sequential ao importar uma biblioteca de tipos de valor.
Exemplos
O exemplo a seguir demonstra uma declaração gerenciada do GetSystemTime de função e define MySystemTime classe com LayoutKind.Explicit layout.GetSystemTimeObtém a hora do sistema e imprime no console.
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 );
}
}
Informações de Versão
Plataforma Universal do Windows
Disponível desde 8
.NET Framework
Disponível desde 1.1
Biblioteca de Classes Portátil
Com suporte no: plataformas portáteis do .NET
Silverlight
Disponível desde 2.0
Windows Phone Silverlight
Disponível desde 7.0
Windows Phone
Disponível desde 8.1
Acesso thread-safe
Quaisquer membros estáticos públicos ( Compartilhado no Visual Basic) desse tipo são thread-safe. Não há garantia de que qualquer membro de instância seja thread-safe.
Confira Também
Namespace System.Runtime.InteropServices
Tlbimp.exe (Importador de Biblioteca de Tipos)
Retornar ao início