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陣列)包含垃圾。我無法找到一種方法來編組數據正確的數組結構?
在p_Total_DWN_Tasks中使用IntPtr而不是結構數組(WProtims_Task_Table [] - > IntPtr)的一種正確方法。並使用Marshall.AllocHGlobal來分配內存。但是這是解決這個問題的另一種方式嗎? – Ivan