標題の通りです。
VB.netにて、構造体メンバーのアライメント設定の方法を
教えていただけないでしょうか?
StructLayout属性を使います。
StructLayoutAttribute クラスをヘルプで調べてみましょう。
よねKANさん、レスありがとうございます。
構造体を下記のように定義したところ、
<StructLayout(LayoutKind.Explicit, Size:=6, CharSet:=CharSet.Ansi)> _
Structure TEST_A
<FieldOffset(0)> Dim A As Short
<FieldOffset(2)> Dim B As Short
<FieldOffset(4), VBFixedString(2),MarshalAs(UnmanagedType.ByValTStr , SizeConst:=2)> Dim C As String
End Structure
追加情報 : アセンブリ 'Interface, Version=1.0.1417.17057,
Culture=neutral, PublicKeyToken=null' から型 'TEST_A' を読み込めません。
というエラーが発生します。
自分の思いとしては、Aに2バイト整数、Bにも2バイト整数、Cに2バイト文字、
というメンバを持つ構造体を定義したいのですが・・・
自分の構造体定義はどこかおかしいのでしょうか?
それともまだ他に属性とやらをつけないといけないのでしょうか?
このような構造体を定義したいのですが、
<StructLayout(LayoutKind.Explicit, Size:=10, CharSet:=CharSet.Ansi)> _
Structure STRC_TEST1
<FieldOffset(0)> Dim A As Short ''2バイト整数
<FieldOffset(2)> Dim B As Integer ''4バイト整数
<FieldOffset(6), VBFixedArray(1), MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> Dim C() As Byte ''2バイト整数
<FieldOffset(8)> Dim D As Short
Public Sub Init()
ReDim C(1)
End Sub
End Structure
<StructLayout(LayoutKind.Explicit, Size:=18, CharSet:=CharSet.Ansi)> _
Structure STRC_TEST2
<FieldOffset(0)> Dim Test1 As STRC_TEST1 ''STRC_TEST構造体
<FieldOffset(10)> Dim E As Integer ''4バイト整数
<FieldOffset(14), VBFixedString(2), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=2)> Dim F As String ''2バイト文字
<FieldOffset(16), VBFixedArray(1), MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> Dim G() As Byte ''2バイトのバイト配列
Public Sub Init()
F = Space(2)
ReDim G(1)
End Sub
End Structure
ヘルプの「StructLayoutAttributeクラス」を見ると、
上記のような書き方っぽいのですが、実行すると、
アセンブリ '6' の型 'STRC_TEST1' を読み込めませんでした。
オフセット 6 に不適切に整列されたか、オブジェクト以外のフィールドで
オーバーラップされたオブジェクト フィールドが含まれています。
というエラーが出ます。
もうどうすればいいのかわからなくて、藁にもすがる思いです。
自分の構造体定義のどの部分が悪いのか、教えていただけないでしょうか?
ツイート | ![]() |