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 回答