最好的方法来制造一个结构数组的指针

时间:2010-01-14 02:36:49

标签: c# c++ struct pointers marshalling

我正在调用C ++中的函数,它返回一个指向struct数组的指针,因为我是这个操作/实现的新手,所以我遇到了问题。

我的C ++代码:

// My C++ Structs
typedef struct _MainData {
 double  dCount;
 DataS1         *DS1;
 int  iCount1;
 DataS2         *DS2;
 int  iCount2;
}MainData;

typedef struct _DataS1 {

 unsigned int uiCount1; 
 unsigned int uiCount2; 
 int  iCount;
 void  *pA; 
 void  *pB; 

} DataS1;

typedef struct _DataS2 {
 unsigned int uiCount1; 
 unsigned int uiCount2;    
 unsigned int uiCount3;    
 unsigned int uiCount4;   
 double  dCount; 
 int  iCount1;     
 char  strLbl[64];
} DataS2;

// My C++ Function
MainData* GetData(const int ID)
{
        MainData* mData;
        int iLength = Get_Count();
        mData = new MainData[iLength];
        for(int x = 0;x < VarCounter; x++)
        {
            // Codes here assign data to mData[x]
        }
        return mData;
}

问题: 如何将C ++函数GetData调用到C#?

我目前在C#中的代码是:

[DllImport(".\\sdata.dll")]
[return: MarshalAs(UnmanagedType.LPArray)]
private static unsafe extern MainData[] GetData(int ID);

// The struct MainData in my C# side is already "Marshalled"...

//My function call is here:
MainData[] SmpMapData = GetData(ID);

当我编译它时,有一个例外: “无法封送'返回值':托管/非托管类型组合无效。”

抱歉编码不好......请帮忙...

2 个答案:

答案 0 :(得分:0)

我尝试做同样的事情,但由于时间不够而没有成功,但我在过程中学到了一些东西:

  1. 在C#中分配内存
  2. 要传递结构数组,struct必须为blittable
  3. 祝你好运,我无法让它发挥作用。

答案 1 :(得分:-1)

一个问题是编组程序不知道C ++代码返回的数组中有多少项。另一种方法可能是有两个C ++方法 - 一个返回项目数,另一个返回给定索引的单个MainData。

你的结构在C#方面看起来像什么?

由于您正在编写C ++和C#端,因此使用C ++ / CLI来连接它们而不是PInvoke可能更容易。