1

問題:

マーシャリングしようとしている固定サイズの構造体があります。この構造体には、現在のバージョンの構造体に役立つ多数のフィールドと、将来の変更のために予約されている最後に指定された量の未使用スペースが含まれています。

構造を変更したときに予約領域のサイズが自動的に更新されるようにするには、この構造をどのように設計すればよいですか?

以下は私の問題を解決しますが

'Variable size structure
<StructLayout(LayoutKind.Sequential, Pack:=1)>
Structure UsefulData
    Dim foo As SByte
    Dim bar As Integer
    Dim foobar As Short
End Structure

Const MAX_SIZE As Integer = 20

'Fixed size structure
<StructLayout(LayoutKind.Sequential, Pack:=1, Size:=MAX_SIZE>
Structure Data
    Dim current As UsefulData
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=MAX_SIZE-System.Runtime.InteropServices.Marshal.SizeOf(GetType(UsefulData)))>
    Dim reserved As SByte()
End Structure

System.Runtime.InteropServices.Marshal.SizeOf(GetType(UsefulData))ただし、定数式ではないためコンパイルされません。何か案は?

4

2 に答える 2

1

この問題についてさらに考えてみると、構造体の最後に予約済みのスペースを公開したいという私の願望の正当性に疑問を抱くようになりました。実際には、予約セクションを参照するものは何もありません。何かが必要になった場合、正しいアプローチは、構造自体を変更して予約済みスペースの関連部分を公開することです。

したがって、構造は次のようになります。

<StructLayout(LayoutKind.Sequential, Size:=20, Pack:=1)>
Structure Data
    Dim foo As SByte
    Dim bar As Integer
    Dim foobar As Short
End Structure
于 2012-08-01T17:18:37.123 に答える
0

配列の長さをハードコーディングすることが理想的な解決策だとは思いませんが、他に選択肢がない場合に備えて、この回答をここに置いています。

Private const TOTAL_SIZE As Integer = 20
Private const RESERVED_SIZE As Integer = 7

<StructLayout(LayoutKind.Sequential, Pack:=1)>
Structure Data
   Dim foo As SByte
   Dim bar As Integer
   Dim foobar As Short
   <MarshalAs(UnManagedType.ByValArray, SizeConst:=RESERVED_SIZE)>
   Dim reserved As SByte()
End Structure

次に、単体テストまたはカスタム ビルド アクションのいずれかを追加して、System.Runtime.InteropServices.Marshal.Sizeof(GetType(Data)) = TOTAL_SIZE.

于 2012-08-01T15:17:44.063 に答える