StructLayoutAttribute クラス
アセンブリ: mscorlib (mscorlib.dll 内)

<ComVisibleAttribute(True)> _ <AttributeUsageAttribute(AttributeTargets.Class Or AttributeTargets.Struct, Inherited:=False)> _ Public NotInheritable Class StructLayoutAttribute Inherits Attribute
[ComVisibleAttribute(true)] [AttributeUsageAttribute(AttributeTargets.Class|AttributeTargets.Struct, Inherited=false)] public sealed class StructLayoutAttribute : Attribute
[ComVisibleAttribute(true)] [AttributeUsageAttribute(AttributeTargets::Class|AttributeTargets::Struct, Inherited=false)] public ref class StructLayoutAttribute sealed : public Attribute

一般に、共通言語ランタイムがマネージ メモリ内のクラスまたは構造体のデータ フィールドの物理的なレイアウトを制御します。クラスまたは構造体を特定の方法で整列する必要がある場合は、StructLayoutAttribute を使用します。特定のレイアウトを予期するアンマネージ コードにクラスを渡す場合、クラス レイアウトの明示的な制御は重要です。LayoutKind 値の Sequential は、表示する順序に従ってメンバをレイアウトするために使用します。Explicit は、各データ メンバの正確な位置を制御します。Explicit では、各メンバは FieldOffsetAttribute を使用して、その型内でフィールドの位置を指定する必要があります。
C#、Visual Basic .NET、および C++ のコンパイラは、既定で Sequential レイアウト値を構造体に適用します。クラスの場合は、Sequential 値を明示的に適用する必要があります。タイプ ライブラリ インポータ (Tlbimp.exe) もこの属性を適用します。タイプ ライブラリをインポートするときに常に Sequential 値を適用します。

次に示すのは、GetSystemTime 関数のマネージ宣言の例です。このコードは、MySystemTime クラスを LayoutKind.Explicit レイアウトで定義します。また、GetSystemTime は、システム タイムを取得してコンソールに出力します。
<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)> 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
[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); } } }
[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 ); } }
/** @attribute StructLayout(LayoutKind.Explicit, Size = 16, CharSet = CharSet.Ansi) */ public class MySystemTime { /** @attribute FieldOffset(0) */ public short wYear; /** @attribute FieldOffset(2) */ public short wMonth; /** @attribute FieldOffset(4) */ public short wDayOfWeek; /** @attribute FieldOffset(6) */ public short wDay; /** @attribute FieldOffset(8) */ public short wHour; /** @attribute FieldOffset(10) */ public short wMinute; /** @attribute FieldOffset(12) */ public short wSecond; /** @attribute FieldOffset(14) */ public short wMilliseconds; } //MySystemTime class LibWrapper { /** @attribute DllImport("kernel32.dll") */ public static native void GetSystemTime( /** @attribute MarshalAs(UnmanagedType.LPStruct) */ MySystemTime st); } //LibWrapper class TestApplication { public static void main(String[] args) { try { MySystemTime sysTime = new MySystemTime(); LibWrapper.GetSystemTime(sysTime); Console.WriteLine("The System time is {0}/{1}/{2} {3}:{4}:{5}" , new Object[] { (Int32)sysTime.wDay, (Int32)sysTime.wMonth , (Int32)sysTime.wYear, (Int32)sysTime.wHour, (Int32)sysTime. wMinute, (Int32)sysTime.wSecond }); } catch (TypeLoadException e) { Console.WriteLine("TypeLoadException : " + e.get_Message()); } catch (System.Exception e) { Console.WriteLine("Exception : " + e.get_Message()); } } //main } //TestApplication

System.Attribute
System.Runtime.InteropServices.StructLayoutAttribute


Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


StructLayoutAttribute コンストラクタ (LayoutKind)
アセンブリ: mscorlib (mscorlib.dll 内)



Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


StructLayoutAttribute コンストラクタ

名前 | 説明 |
---|---|
StructLayoutAttribute (Int16) | 指定した System.Runtime.InteropServices.LayoutKind 列挙体メンバを使用して、StructLayoutAttribute クラスの新しいインスタンスを初期化します。 |
StructLayoutAttribute (LayoutKind) | 指定した System.Runtime.InteropServices.LayoutKind 列挙体メンバを使用して、StructLayoutAttribute クラスの新しいインスタンスを初期化します。 .NET Compact Framework によってサポートされています。 |

StructLayoutAttribute コンストラクタ (Int16)
アセンブリ: mscorlib (mscorlib.dll 内)


このコンストラクタは、LayoutKind 列挙体の各メンバを表す、基になる 16 ビット整数値を受け取ります。タイプ ライブラリ インポータ (Tlbimp.exe) は、このコンストラクタを使用します。

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


StructLayoutAttribute フィールド
StructLayoutAttribute プロパティ

名前 | 説明 | |
---|---|---|
![]() | TypeId | 派生クラスに実装されている場合は、この Attribute の一意の識別子を取得します。 ( Attribute から継承されます。) |
![]() | Value | クラスまたは構造体を整列する方法を指定する LayoutKind 値を取得します。 |

StructLayoutAttribute メソッド

名前 | 説明 | |
---|---|---|
![]() | Equals | オーバーロードされます。 ( Attribute から継承されます。) |
![]() | GetCustomAttribute | オーバーロードされます。 アセンブリ、モジュール、型のメンバ、またはメソッド パラメータに適用された指定した型のカスタム属性を取得します。 ( Attribute から継承されます。) |
![]() | GetCustomAttributes | オーバーロードされます。 アセンブリ、モジュール、型のメンバ、またはメソッド パラメータに適用されたカスタム属性の配列を取得します。 ( Attribute から継承されます。) |
![]() | GetHashCode | このインスタンスのハッシュ コードを返します。 ( Attribute から継承されます。) |
![]() | GetType | 現在のインスタンスの Type を取得します。 ( Object から継承されます。) |
![]() | IsDefaultAttribute | 派生クラス内でオーバーライドされたときに、このインスタンスの値が派生クラスの既定値かどうかを示します。 ( Attribute から継承されます。) |
![]() | IsDefined | オーバーロードされます。 指定した型のカスタム属性が、アセンブリ、モジュール、型のメンバ、またはメソッド パラメータに適用されているかどうかを判断します。 ( Attribute から継承されます。) |
![]() | Match | 派生クラス内でオーバーライドされたときに、指定したオブジェクトとこのインスタンスが等しいかどうかを示す値を返します。 ( Attribute から継承されます。) |
![]() | ReferenceEquals | 指定した複数の Object インスタンスが同一かどうかを判断します。 ( Object から継承されます。) |
![]() | ToString | 現在の Object を表す String を返します。 ( Object から継承されます。) |

StructLayoutAttribute メンバ
StructLayoutAttribute クラスを使用すると、クラスまたは構造体のデータ フィールドの物理的なレイアウトを制御できます。
StructLayoutAttribute データ型で公開されるメンバを以下の表に示します。



名前 | 説明 | |
---|---|---|
![]() | TypeId | 派生クラスに実装されている場合は、この Attribute の一意の識別子を取得します。(Attribute から継承されます。) |
![]() | Value | クラスまたは構造体を整列する方法を指定する LayoutKind 値を取得します。 |

名前 | 説明 | |
---|---|---|
![]() | Equals | オーバーロードされます。 ( Attribute から継承されます。) |
![]() | GetCustomAttribute | オーバーロードされます。 アセンブリ、モジュール、型のメンバ、またはメソッド パラメータに適用された指定した型のカスタム属性を取得します。 (Attribute から継承されます。) |
![]() | GetCustomAttributes | オーバーロードされます。 アセンブリ、モジュール、型のメンバ、またはメソッド パラメータに適用されたカスタム属性の配列を取得します。 (Attribute から継承されます。) |
![]() | GetHashCode | このインスタンスのハッシュ コードを返します。 (Attribute から継承されます。) |
![]() | GetType | 現在のインスタンスの Type を取得します。 (Object から継承されます。) |
![]() | IsDefaultAttribute | 派生クラス内でオーバーライドされたときに、このインスタンスの値が派生クラスの既定値かどうかを示します。 (Attribute から継承されます。) |
![]() | IsDefined | オーバーロードされます。 指定した型のカスタム属性が、アセンブリ、モジュール、型のメンバ、またはメソッド パラメータに適用されているかどうかを判断します。 (Attribute から継承されます。) |
![]() | Match | 派生クラス内でオーバーライドされたときに、指定したオブジェクトとこのインスタンスが等しいかどうかを示す値を返します。 (Attribute から継承されます。) |
![]() | ReferenceEquals | 指定した複数の Object インスタンスが同一かどうかを判断します。 (Object から継承されます。) |
![]() | ToString | 現在の Object を表す String を返します。 (Object から継承されます。) |

- StructLayoutAttributeのページへのリンク