StructLayoutAttribute 클래스

정의

메모리에 있는 클래스 또는 구조체의 데이터 필드에 대한 실제 레이아웃을 제어할 수 있습니다.Lets you control the physical layout of the data fields of a class or structure in memory.

public ref class StructLayoutAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct, Inherited=false)]
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class StructLayoutAttribute : Attribute
type StructLayoutAttribute = class
    inherit Attribute
Public NotInheritable Class StructLayoutAttribute
Inherits Attribute
상속
StructLayoutAttribute
특성

예제

다음 예제에서는 관리 되는 선언 된 GetSystemTime 함수를 정의 MySystemTime 클래스와 LayoutKind.Explicit 레이아웃 합니다.The following example demonstrates a managed declaration of the GetSystemTime function and defines MySystemTime class with LayoutKind.Explicit layout. GetSystemTime 콘솔 출력 및 시스템 시간을 가져옵니다.GetSystemTime gets the system time and prints to the 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 

설명

이 특성은 클래스 또는 구조체에 적용할 수 있습니다.You can apply this attribute to classes or structures.

공용 언어 런타임 클래스 또는 구조체의 관리 되는 메모리의 데이터 필드에 대 한 실제 레이아웃을 제어합니다.The common language runtime controls the physical layout of the data fields of a class or structure in managed memory. 그러나 형식을 관리 되지 않는 코드에 전달 하려는 경우 사용할 수는 StructLayoutAttribute 특성 형식의 관리 되지 않는 레이아웃을 제어 합니다.However, if you want to pass the type to unmanaged code, you can use the StructLayoutAttribute attribute to control the unmanaged layout of the type. 특성을 사용 하 여 LayoutKind.Sequential 멤버가 나타나는 순서 대로 순차적으로 배치 합니다.Use the attribute with LayoutKind.Sequential to force the members to be laid out sequentially in the order they appear. Blittable 형식에 대 한 LayoutKind.Sequential 모두 관리 되는 메모리의 레이아웃 및 관리 되지 않는 메모리의 레이아웃을 제어 합니다.For blittable types, LayoutKind.Sequential controls both the layout in managed memory and the layout in unmanaged memory. 비 blittable 형식에 대 한 경우 클래스 또는 구조체 비관리 코드로 마샬링될 관리 되는 메모리의 레이아웃을 제어 하지는 않습니다 레이아웃을 제어 합니다.For non-blittable types, it controls the layout when the class or structure is marshaled to unmanaged code, but does not control the layout in managed memory. 특성을 사용 하 여 LayoutKind.Explicit 각 데이터 멤버의 정확한 위치를 제어 합니다.Use the attribute with LayoutKind.Explicit to control the precise position of each data member. 이 모두 blittable 형식 및 비 blittable 형식에 대 한 관리 및 비관리 레이아웃을 영향을 줍니다.This affects both managed and unmanaged layout, for both blittable and non-blittable types. 사용 하 여 LayoutKind.Explicit 사용을 요구 하는 FieldOffsetAttribute 형식 내에서 각 필드의 위치를 나타내는 특성입니다.Using LayoutKind.Explicit requires that you use the FieldOffsetAttribute attribute to indicate the position of each field within the type.

C#, Visual Basic 및 c + + 컴파일러에서 적용 된 Sequential 기본적으로 구조 레이아웃 값입니다.C#, Visual Basic, and C++ compilers apply the Sequential layout value to structures by default. 클래스를 적용 해야 합니다는 LayoutKind.Sequential 값을 명시적으로 합니다.For classes, you must apply the LayoutKind.Sequential value explicitly. Tlbimp.exe (형식 라이브러리 가져오기) 도 적용 됩니다는 StructLayoutAttribute 특성; 항상 적용 됩니다는 LayoutKind.Sequential 형식 라이브러리를 가져올 때 값입니다.The Tlbimp.exe (Type Library Importer) also applies the StructLayoutAttribute attribute; it always applies the LayoutKind.Sequential value when it imports a type library.

생성자

StructLayoutAttribute(Int16)

지정된 StructLayoutAttribute 열거형 멤버를 사용하여 LayoutKind 클래스의 새 인스턴스를 초기화합니다.Initializes a new instance of the StructLayoutAttribute class with the specified LayoutKind enumeration member.

StructLayoutAttribute(LayoutKind)

지정된 StructLayoutAttribute 열거형 멤버를 사용하여 LayoutKind 클래스의 새 인스턴스를 초기화합니다.Initializes a new instance of the StructLayoutAttribute class with the specified LayoutKind enumeration member.

필드

CharSet

클래스 내의 문자열 데이터 필드가 기본적으로 LPWSTR 또는 LPSTR(으)로 마샬링되어야 하는지 여부를 나타냅니다.Indicates whether string data fields within the class should be marshaled as LPWSTR or LPSTR by default.

Pack

메모리에 있는 클래스 또는 구조체의 데이터 필드 맞춤을 제어합니다.Controls the alignment of data fields of a class or structure in memory.

Size

클래스나 구조체의 절대적인 크기를 나타냅니다.Indicates the absolute size of the class or structure.

속성

TypeId

파생 클래스에서 구현된 경우 이 Attribute에 대한 고유 식별자를 가져옵니다.When implemented in a derived class, gets a unique identifier for this Attribute.

(다음에서 상속됨 Attribute)
Value

클래스나 구조의 배열 방법을 지정하는 LayoutKind 값을 가져옵니다.Gets the LayoutKind value that specifies how the class or structure is arranged.

메서드

Equals(Object)

이 인스턴스가 지정한 개체와 같은지를 나타내는 값을 반환합니다.Returns a value that indicates whether this instance is equal to a specified object.

(다음에서 상속됨 Attribute)
GetHashCode()

이 인스턴스의 해시 코드를 반환합니다.Returns the hash code for this instance.

(다음에서 상속됨 Attribute)
GetType()

현재 인스턴스의 Type을 가져옵니다.Gets the Type of the current instance.

(다음에서 상속됨 Object)
IsDefaultAttribute()

파생 클래스에서 재정의된 경우 이 인스턴스 값이 파생 클래스에 대한 기본값인지 여부를 표시합니다.When overridden in a derived class, indicates whether the value of this instance is the default value for the derived class.

(다음에서 상속됨 Attribute)
Match(Object)

파생 클래스에서 재정의된 경우 이 인스턴스가 지정된 개체와 같은지 여부를 나타내는 값을 반환합니다.When overridden in a derived class, returns a value that indicates whether this instance equals a specified object.

(다음에서 상속됨 Attribute)
MemberwiseClone()

현재 Object의 단순 복사본을 만듭니다.Creates a shallow copy of the current Object.

(다음에서 상속됨 Object)
ToString()

현재 개체를 나타내는 문자열을 반환합니다.Returns a string that represents the current object.

(다음에서 상속됨 Object)

명시적 인터페이스 구현

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

이름 집합을 해당하는 디스패치 식별자 집합에 매핑합니다.Maps a set of names to a corresponding set of dispatch identifiers.

(다음에서 상속됨 Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

인터페이스의 형식 정보를 가져오는 데 사용할 수 있는 개체의 형식 정보를 검색합니다.Retrieves the type information for an object, which can be used to get the type information for an interface.

(다음에서 상속됨 Attribute)
_Attribute.GetTypeInfoCount(UInt32)

개체에서 제공하는 형식 정보 인터페이스의 수를 검색합니다(0 또는 1).Retrieves the number of type information interfaces that an object provides (either 0 or 1).

(다음에서 상속됨 Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

개체에서 노출하는 메서드와 속성에 대한 액세스를 제공합니다.Provides access to properties and methods exposed by an object.

(다음에서 상속됨 Attribute)

적용 대상

추가 정보