VB.netで構造体メンバーのアライメント設定をするには


VB.Net超初心者  2003-11-19 22:17:24  No: 110037

標題の通りです。
VB.netにて、構造体メンバーのアライメント設定の方法を
教えていただけないでしょうか?


よねKEN  2003-11-19 22:41:07  No: 110038

StructLayout属性を使います。
StructLayoutAttribute クラスをヘルプで調べてみましょう。


VB.Net超初心者  2003-11-20 00:08:48  No: 110039

よね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バイト文字、
というメンバを持つ構造体を定義したいのですが・・・

自分の構造体定義はどこかおかしいのでしょうか?
それともまだ他に属性とやらをつけないといけないのでしょうか?


VB.Net超初心者  2003-11-20 03:22:10  No: 110040

このような構造体を定義したいのですが、

    <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 に不適切に整列されたか、オブジェクト以外のフィールドで
オーバーラップされたオブジェクト フィールドが含まれています。

というエラーが出ます。
もうどうすればいいのかわからなくて、藁にもすがる思いです。
自分の構造体定義のどの部分が悪いのか、教えていただけないでしょうか?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加