StructLayoutAttribute Klasa
Definicja
Ważny
Niektóre informacje dotyczą produktów przedpremierowych, które mogą zostać znacznie zmodyfikowane przed premierą. Microsoft nie udziela żadnych gwarancji, ani wyraźnych, ani domniemanych, dotyczących informacji podanych tutaj.
Umożliwia sterowanie fizycznym układem pól danych klasy lub struktury w pamięci.
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
- Dziedziczenie
- Atrybuty
Przykłady
W poniższym przykładzie pokazano zarządzaną deklarację GetSystemTime funkcji i definiuje MySystemTime klasę z układem LayoutKind.Explicit .
GetSystemTime pobiera czas systemowy i drukuje do konsoli.
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
Uwagi
Ten atrybut można zastosować do klas lub struktur.
Środowisko uruchomieniowe języka wspólnego steruje fizycznym układem pól danych klasy lub struktury w pamięci zarządzanej. Jeśli jednak chcesz przekazać typ do kodu niezarządzanego, możesz użyć atrybutu StructLayoutAttribute do kontrolowania niezarządzanego układu typu. Użyj atrybutu z LayoutKind.Sequential , aby wymusić kolejność układów składowych w kolejności ich wyświetlania. W przypadku typów LayoutKind.Sequential blittable steruje zarówno układem w pamięci zarządzanej, jak i układem w pamięci niezarządzanej. W przypadku typów innych niż blittable steruje układem, gdy klasa lub struktura jest marshaled do niezarządzanego kodu, ale nie kontroluje układu w pamięci zarządzanej. Użyj atrybutu z, LayoutKind.Explicit aby kontrolować dokładną pozycję każdego elementu członkowskiego danych. Ma to wpływ zarówno na układ zarządzany, jak i niezarządzany, zarówno dla typów blittable, jak i niezwiązanych z błędami. Użycie LayoutKind.Explicit polecenia wymaga, aby za pomocą atrybutu FieldOffsetAttribute wskazać położenie każdego pola w typie.
Kompilatory języka C#, Visual Basic i C++ domyślnie stosują Sequential wartość układu do struktur. W przypadku klas należy jawnie zastosować LayoutKind.Sequential wartość. Tlbimp.exe (importer biblioteki typów) stosuje StructLayoutAttribute również atrybut; zawsze stosuje LayoutKind.Sequential wartość podczas importowania biblioteki typów.
Konstruktorów
| Nazwa | Opis |
|---|---|
| StructLayoutAttribute(Int16) |
Inicjuje StructLayoutAttribute nowe wystąpienie klasy przy użyciu określonego LayoutKind elementu członkowskiego wyliczenia. |
| StructLayoutAttribute(LayoutKind) |
Inicjuje StructLayoutAttribute nowe wystąpienie klasy przy użyciu określonego LayoutKind elementu członkowskiego wyliczenia. |
Pola
| Nazwa | Opis |
|---|---|
| CharSet |
Wskazuje, czy pola danych ciągu w klasie powinny być domyślnie marshalowane jako |
| Pack |
Określa wyrównanie pól danych klasy lub struktury w pamięci. |
| Size |
Wskazuje bezwzględny rozmiar klasy lub struktury. |
Właściwości
| Nazwa | Opis |
|---|---|
| TypeId |
Po zaimplementowaniu w klasie pochodnej pobiera unikatowy identyfikator dla tego elementu Attribute. (Dziedziczone od Attribute) |
| Value |
LayoutKind Pobiera wartość określającą sposób rozmieszczania klasy lub struktury. |
Metody
| Nazwa | Opis |
|---|---|
| Equals(Object) |
Zwraca wartość wskazującą, czy to wystąpienie jest równe podanemu obiektowi. (Dziedziczone od Attribute) |
| GetHashCode() |
Zwraca wartość skrótu dla tego wystąpienia. (Dziedziczone od Attribute) |
| GetType() |
Type Pobiera bieżące wystąpienie. (Dziedziczone od Object) |
| IsDefaultAttribute() |
W przypadku zastąpienia w klasie pochodnej wskazuje, czy wartość tego wystąpienia jest wartością domyślną klasy pochodnej. (Dziedziczone od Attribute) |
| Match(Object) |
W przypadku zastąpienia w klasie pochodnej zwraca wartość wskazującą, czy to wystąpienie jest równe określonemu obiektowi. (Dziedziczone od Attribute) |
| MemberwiseClone() |
Tworzy płytkią kopię bieżącego Objectelementu . (Dziedziczone od Object) |
| ToString() |
Zwraca ciąg reprezentujący bieżący obiekt. (Dziedziczone od Object) |
Implementacje interfejsów jawnych
| Nazwa | Opis |
|---|---|
| _Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
Zestaw nazw jest mapowany na odpowiedni zestaw identyfikatorów wysyłania. (Dziedziczone od Attribute) |
| _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) |
Pobiera informacje o typie obiektu, którego można użyć do pobrania informacji o typie interfejsu. (Dziedziczone od Attribute) |
| _Attribute.GetTypeInfoCount(UInt32) |
Pobiera informację o liczbie typów interfejsów, jakie zawiera obiekt (0 lub 1). (Dziedziczone od Attribute) |
| _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
Umożliwia dostęp do właściwości i metod udostępnianych przez obiekt. (Dziedziczone od Attribute) |