具有动态数组大小(不正确的大小)的封送结构

时间:2014-07-07 16:45:11

标签: c# c++ struct pinvoke marshalling

我有一个场景,我需要对具有可变大小字节数组的结构进行Marshal。

我已经将这个问题作为我的向导,但我仍然对这个问题存在疑问。

Marshalling dynamic size array into struct

c ++代码

// frame headers
typedef struct _VENUS_HEADER
{
    BOOLEAN             Relative;   // TRUE = relative timing (use Milliseconds)
                                            // FALSE = absolute timing (use Tics)
    VENUS_SEQUENCE      Sequence;   //sequence number
    VENUS_TIMESTAMP Time;       // relative time to display in Milliseconds

} VENUS_HEADER, *PVENUS_HEADER;

// WriteFile format
typedef struct _VENUS_IMAGE
{
    VENUS_HEADER    Header;         // sequence & time
    UCHAR               Frame[1];       // frame data
} VENUS_IMAGE, *PVENUS_IMAGE;

C#代码

[StructLayout(LayoutKind.Sequential)]
        public struct VENUS_TIMESTAMP
        {
            public long Tics;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct VENUS_HEADER
        {
            [MarshalAs(UnmanagedType.Bool)]
            public bool             Relative;   // TRUE = relative timing (use Milliseconds)
                                                // FALSE = absolute timing (use Tics)
            public uint             Sequence;   //sequence number
            public VENUS_TIMESTAMP  Time;       // relative time to display in Milliseconds
        } 

        // WriteFile format
        [StructLayout(LayoutKind.Sequential)]
        public struct VENUS_IMAGE
        {
            //public int MyProperty { get; set; }
            public VENUS_HEADER Header; // sequence & time
            public IntPtr Frame;        // frame data       
        } 


byte[] bulbData = bulb.Bitmap2Bulb(img);
venusImage.Frame = Marshal.AllocHGlobal(bulbData.Length);                                                   Marshal.Copy(bulbData, 0, venusImage.Frame, bulbData.Length);
int size = Marshal.SizeOf(venusImage);

我的大小报告为24,无论IntPtr的值或byte []大小。我相信结构的最终大小应该是921616.任何肝脏都会受到赞赏。

0 个答案:

没有答案