如何从C#到C 结构

How to marshall struct from c# to c++?

本文关键字:结构      更新时间:2023-10-16

我有一项任务,可以基于C 结构(也带有内部结构)创建编组C#structs。然后,我应该将此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_TASK_TASK_TABL的指针)包含垃圾。我找不到一种方法可以正确地将数组数据正确到C 结构?

我强烈推荐Swig。我定期使用它将C 对象带入C#,并且非常简单。