小弟最近做一个项目,需要c#调用第三方的DLL,但是DLL接口是我来定,Dll里面的算法具体别人实现。DLL接口暂定如下:
ANALYZEPLANES_API int _stdcall GetCalculateResults(double measureVar[],int PlanesID[],double holeAngle[],double holeDepths[])
{
}
其measureVar[]数组长度是确定的为4,别人拿到这个数组之后,在算法中用其中的数据进行计算。利用接口的其它数组返回计算结果,问题在于计算的数据最终长度不确定,因此我在c#端调用时传递实参数组时不知道应该传多长的数组。当然我想到一个比较笨的方法。是在c#端传递足够长的实参数组,但总觉得这种方法不好。所以想请教各位高手,能不能有好的方法解决这个问题。
ANALYZEPLANES_API int _stdcall GetCalculateResults(double measureVar[],int PlanesID[],double holeAngle[],double holeDepths[])
{
}
其measureVar[]数组长度是确定的为4,别人拿到这个数组之后,在算法中用其中的数据进行计算。利用接口的其它数组返回计算结果,问题在于计算的数据最终长度不确定,因此我在c#端调用时传递实参数组时不知道应该传多长的数组。当然我想到一个比较笨的方法。是在c#端传递足够长的实参数组,但总觉得这种方法不好。所以想请教各位高手,能不能有好的方法解决这个问题。
楼主,你定义的C++接口有问题,改成:ANALYZEPLANES_API int _stdcall GetCalculateResults(double measureVar[],int measureSize,int PlanesID[],int planeSize,double holeAngle[],int angleSize,double holeDepths[],int depthSize);你必须明确告诉net这边数组大小,否则它没法正确分配空间,就更谈不上正确传递参数!
//a 输出参数,可能会改变长度
void test(char[] a)
{
//因为是输出参数,且会改变长度,而一段已分配的地址,无法随便改变长度
//所以
a = remalloc(....);
strcpy(a,"......");
}
//请问可以改变吗???
第二种方法就是dll中写两个函数,一个被调用时在堆中分配空间并返回地址和长度,一个函数释放堆内存空间。调用方调用完第一个函数并直接处理数据后,调用第二个函数释放内存。