2011-02-23 51 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的錯誤

相關問題