2011-02-23 74 views
1
[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个字节。这严重阻碍了我通过电线的互操作性。任何人都知道为什么?结构布局的WinCE提供了意想不到的效果

回答

0

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

+0

在最后使用未使用的4字节(int32)填充结构使它们在两种体系结构上都是相同的大小。这解决了我的问题。我同意ctacke ......这似乎是CF中的一个bug。 (我使用3.5) – dviljoen 2011-03-01 14:20:58

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的错误