[StructLayout(LayoutKind.Sequential)]
    public struct array 
    {
        [MarshalAs(UnmanagedType.U4)]
        UInt32 _Begin;
        [MarshalAs(UnmanagedType.U4)]
        UInt32 _End;
        [MarshalAs(UnmanagedType.U4)]
        UInt32 _Allocated;
        [MarshalAs(UnmanagedType.Struct)]
        block _Block;
    }    [StructLayout(LayoutKind.Sequential)]
    public struct block
    {
        [MarshalAs(UnmanagedType.U4)]
        UInt32 Ptr;
        [MarshalAs(UnmanagedType.U4)]
        UInt32 Id;
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct notify
    {
        [MarshalAs(UnmanagedType.FunctionPtr)]
        notifyfunc Func;
        IntPtr This;
    }    [StructLayout(LayoutKind.Sequential)]
    public struct context 
    {
        [MarshalAs(UnmanagedType.I4)]
        public int Version;//4
        public IntPtr Wnd;//4
        public IntPtr LoadModule;//4
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]//20*2,
        public array[] StrTable;
    }
    int a = Marshal.SizeOf( typeof(context) );//运行后这里a=68
    通过计算应该为4+4+4+4+40=56.运行后结果为68,
    为什么结果是68,我想得到56的结果应该怎么办?

解决方案 »

  1.   

    32位,52(4*3+20*2)
    64位,64(4+4(对齐)+8*2+20*2)你可以看一下IntPtr.Size
      

  2.   

    各位,调试跟踪确实是68,还有我用的是32位的ARM9,
    更正一下,通过手工计算应该是52的,还有调试跟踪IntPtr.Size = 4!
    还有没有能够解答的?
      

  3.   

    对齐的问题
    C++里的话应该是编译器选项
    C#不知道应该是那个directive
      

  4.   

    [StructLayout(LayoutKind.Sequential)]
        public struct context
        {
            [MarshalAs(UnmanagedType.I4)]
            public int Version;//4
            public IntPtr Wnd;//4
            public IntPtr LoadModule;//4
            //以上为前半截
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]//20*2,
            public array[] StrTable;
            //以上为后半截
        } 如果只有前半截,长度就是12,只有后半截,长度就是40,两截都有,就是68,哈