2014-01-22 74 views
3

我有一個任務來創建基於C++結構(也包含內部結構)的編組c#結構。然後我應該把這個C#結構體發送給dllimport C++方法。如何將從c#結構到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陣列)包含垃圾。我無法找到一種方法來編組數據正確的數組結構?

+1

在p_Total_DWN_Tasks中使用IntPtr而不是結構數組(WProtims_Task_Table [] - > IntPtr)的一種正確方法。並使用Marshall.AllocHGlobal來分配內存。但是這是解決這個問題的另一種方式嗎? – Ivan

回答

1

爲此我強烈推薦SWIG。我經常使用它將C++對象引入C#,並且它非常簡單。