【问题标题】:How to marshall struct from c# to c++?如何将结构从 c# 编组到 c++?
【发布时间】:2014-01-22 09:37:59
【问题描述】:

我的任务是创建基于 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++ 结构的方法?

【问题讨论】:

  • 在 p_Total_DWN_Tasks 中使用 IntPtr 而不是结构数组 (WProtims_Task_Table[] -> IntPtr) 的一种正确方法。并使用 Marshall.AllocHGlobal 分配内存。但这是解决这个问题的另一种方法吗?

标签: c# c++ arrays struct marshalling


【解决方案1】:

为此我强烈推荐SWIG。我经常使用它来将 C++ 对象引入 C#,它非常简单。

【讨论】:

    猜你喜欢
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多