2012-08-01 43 views
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))不是一个常量表达式。有任何想法吗?

回答

1

经过对这个问题的进一步思考,我开始质疑我希望在结构的末尾公开保留空间的有效性。实际上什么都不应该引用保留部分。如果有需要的话,那么正确的做法是修改结构本身以暴露保留空间的相关部分。

因此结构应如下所示:

<StructLayout(LayoutKind.Sequential, Size:=20, Pack:=1)> 
Structure Data 
    Dim foo As SByte 
    Dim bar As Integer 
    Dim foobar As Short 
End Structure 
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