如何将结构从c#编组到c ++?

时间:2014-01-22 09:37:59

标签: c# c++ arrays struct marshalling

我有一个任务是根据c ++结构(也使用内部结构)创建编组c#结构。然后我应该将这个c#结构发送到dllimport c ++方法。

下面的基本c ++结构:

    
    struct WProtims_Task_Table
    {
        Protims_DWN_OS_Task p_List_OS_Task[20];
        Protims_CMD_CFSYS_Task p_List_CFSYS_Task[20];

        int iTotalTaskNum;
    } ;

    struct WProtims_QueryDownloadTask_ACK
    {
        BYTE SystemDateTime[6];
        BYTE TaskTableLen[4];
        BYTE RespCode[1];
        WProtims_Task_Table *p_Total_DWN_Tasks;
    } ;

一个结构(WProtims_QueryDownloadTask_ACK)包含指向其他结构数组的指针(WProtims_Task_Table *)。我在下面创建了c#结构:


    [StructLayout(LayoutKind.Sequential)]
    class WProtims_Task_Table
    {      
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
        public Protims_DWN_OS_Task[] p_List_OS_Task = new Protims_DWN_OS_Task[20];
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
        public Protims_CMD_CFSYS_Task[] p_List_CFSYS_Task = new Protims_CMD_CFSYS_Task[20];

         public int iTotalTaskNum;
    } ;

    [StructLayout(LayoutKind.Sequential)]
    class WProtims_QueryDownloadTask_ACK
    {
         [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
         public byte[] SystemDateTime;
         [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
         public byte[] TaskTableLen;
         [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
         public byte[] RespCode;
         [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
         public WProtims_Task_Table[] p_Total_DWN_Tasks = new WProtims_Task_Table[20];
    } ;

当我将此结构发送到c ++方法时,我得到了正确的第一个字段(SystemDateTime,TaskTableLen,RespCode的字节数组),但最后一个字段(指向WProtims_Task_Table数组的指针)包含垃圾。我找不到一种方法来将数组数据正确编组到c ++ struct?

1 个答案:

答案 0 :(得分:1)

我强烈推荐SWIG。我经常使用它将C ++对象引入C#并且非常直接。