2010-01-14 78 views
1

我从C++调用函数返回一个指向结构数组的指针,我有问题,因为我是这个操作/实现的新手。最好的方法来元帅结构数组的指针

我的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); 

当我编译它,有一个例外: “不能元帅‘返回值’:无效的托管/非托管类型组合。”

对不起,糟糕的编码......请帮助...

回答

-1

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

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

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

0

我试图做同样的事情,但由于时间不够没能成功,但我学会了在处理事情:

  1. 在C#中分配内存
  2. 要通过结构的数组,结构必须是blittable

祝你好运,我无法让它工作。