StructLayoutAttribute 类  
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
允许你控制内存中类或结构的数据字段的物理布局。
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 AttributePublic NotInheritable Class StructLayoutAttribute
Inherits Attribute- 继承
- 属性
示例
以下示例演示函数的GetSystemTime托管声明,并定义具有LayoutKind.Explicit布局的MySystemTime类。 
              GetSystemTime 获取系统时间并打印到控制台。
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
注解
可以将此属性应用于类或结构。
公共语言运行时控制托管内存中类或结构的数据字段的物理布局。 但是,如果要将类型传递给非托管代码,可以使用 StructLayoutAttribute 属性来控制该类型的非托管布局。 将 属性与 一起使用 LayoutKind.Sequential 可强制成员按其出现顺序进行布局。 对于 blittable 类型, LayoutKind.Sequential 控制托管内存中的布局和非托管内存中的布局。 对于非 blittable 类型,当类或结构封送到非托管代码时,它控制布局,但不控制托管内存中的布局。 将 属性与 结合使用 LayoutKind.Explicit 来控制每个数据成员的精确位置。 这会影响 blittable 和非 blittable 类型的托管和非托管布局。 Using LayoutKind.Explicit 要求使用 FieldOffsetAttribute 特性来指示每个字段在类型中的位置。
默认情况下,C#、Visual Basic 和 C++ 编译器会将 Sequential 布局值应用于结构。 对于类,必须显式应用 LayoutKind.Sequential 值。 Tlbimp.exe (类型库导入程序) 也应用 StructLayoutAttribute 属性;它始终在导入类型库时应用 LayoutKind.Sequential 值。
构造函数
| StructLayoutAttribute(Int16) | 使用指定的 LayoutKind 枚举成员初始化 StructLayoutAttribute 类的新实例。 | 
| StructLayoutAttribute(LayoutKind) | 使用指定的 LayoutKind 枚举成员初始化 StructLayoutAttribute 类的新实例。 | 
字段
| CharSet | 指示在默认情况下是否应将类中的字符串数据字段作为  | 
| Pack | 控制类或结构的数据字段在内存中的对齐方式。 | 
| Size | 指示类或结构的绝对大小。 | 
属性
| TypeId | 在派生类中实现时,获取此 Attribute 的唯一标识符。(继承自 Attribute) | 
| Value | 获取 LayoutKind 值,该值指定如何排列类或结构。 | 
方法
| Equals(Object) | 返回一个值,该值指示此实例是否与指定的对象相等。(继承自 Attribute) | 
| GetHashCode() | 返回此实例的哈希代码。(继承自 Attribute) | 
| GetType() | 获取当前实例的 Type。(继承自 Object) | 
| IsDefaultAttribute() | 在派生类中重写时,指示此实例的值是否是派生类的默认值。(继承自 Attribute) | 
| Match(Object) | 当在派生类中重写时,返回一个指示此实例是否等于指定对象的值。(继承自 Attribute) | 
| MemberwiseClone() | 创建当前 Object 的浅表副本。(继承自 Object) | 
| ToString() | 返回表示当前对象的字符串。(继承自 Object) | 
显式接口实现
| _Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) | 将一组名称映射为对应的一组调度标识符。(继承自 Attribute) | 
| _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) | 检索对象的类型信息,然后可以使用该信息获取接口的类型信息。(继承自 Attribute) | 
| _Attribute.GetTypeInfoCount(UInt32) | 检索对象提供的类型信息接口的数量(0 或 1)。(继承自 Attribute) | 
| _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) | 提供对某一对象公开的属性和方法的访问。(继承自 Attribute) |