如何将C#中的结构体转换为C++?

3

我有一个任务,需要创建基于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_QueryDownlodaTask_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++结构体的方法。


1
在 p_Total_DWN_Tasks 中,使用 IntPtr 而不是结构数组(WProtims_Task_Table [] -> IntPtr)是一种合适的方法,并使用 Marshall.AllocHGlobal 来分配内存。但是还有其他解决方法吗? - Ivan
1个回答

1

我强烈推荐使用SWIG来完成此任务。我经常使用它将C++对象导入到C#中,非常简单明了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接