WinCE上的Struct Layout会产生意外结果

时间:2011-02-23 23:57:57

标签: c# struct windows-ce

[StructLayout( LayoutKind.Explicit, Pack = 1, Size = 20 )]
public struct StatusStruct
{
    /// <summary>
    /// validation field
    /// </summary>
    [FieldOffset( 0 )]
    public Int32 _magic;
    /// <summary>
    /// Packet sequence number
    /// </summary>
    [FieldOffset( 4 )]
    public Int32 _seq;
    /// <summary>
    /// Packet timestamp
    /// </summary>
    [FieldOffset( 8 )]
    public Int64 _timestamp;
    /// <summary>
    /// Length of data section
    /// </summary>
    [FieldOffset( 16 )]
    public Int32 _len;
}

我在Arm4 / WinCE上有一个奇怪的问题,这个结构的Marshal.SizeOf()返回24个字节,但在x86 / Win32系统上它返回20个字节。这严重妨碍了我对线路的互操作性。有谁知道为什么?

2 个答案:

答案 0 :(得分:1)

我无法解释,但我当然可以证实。它也与CPU架构无关。在ARM或x86上,结构在Compact Framework中最终为24个字节,在完整框架中为20个字节。如果我在本机代码中创建等效项,那就是预期的20。

在内存视图中查看它,我可以看到编译器在结构的末尾添加了4个字节的零填充,但我不知道为什么。

var test = new StatusStruct()
 {
     _magic = unchecked((int)0xaaaaaaaa),
     _seq = unchecked((int)0xbbbbbbbb),
     _timestamp = unchecked((long)0xcccccccccccccccc),
     _len = unchecked((int)0xdddddddd)
 };

http://blog.opennetcf.com/ctacke/binary/struct_size.png

我肯定称这是CF中的一个错误。

答案 1 :(得分:0)

提出解决问题的解决方法。我在结构的末尾添加了一个额外的“Int32 _unused”,以便它将整个结构对齐到一个8字节的边界。 Arm4上的大小仍为24,x86上为24。这给了我需要的互操作。这似乎是Arm架构上的对齐问题。我怀疑它与Int64成员有关,但我不是肯定的。