在C++中递归计算,然后将计算出来的结果返回到数组中;因此数组大小是动态的;
EXPORT void CppToCS_Interpolation(int n, int p, double U_Vector[], double output[],PolyLine_Point* Control_point,int *m)
{
//将插补封装在C++中只返回常规的结果给C#调用;
double Step_B = 0;
double ui = 0;
Node_List DP_List; //自定义结构
CpptoBSpline_Interpolation(n, p, U_Vector, Control_point, ui, 0.001, Step_B,DP_List);//递归
int L1 = 0;
L1 = DP_List.Amount();
*m = L1;
for (int j = 0; j < (*m); j++)
{
output[j] = DP_List.GetValue(j + 1);
}
return ;
}
在C#进行封装时,声明:
[DllImport("InterpolationNC.dll", EntryPoint = "CppToCS_Interpolation")]
public unsafe static extern void CppToCS_Interpolation(int n,int p,double[] U_Vector,ref double[] output,PolyLine_Point[] Control_Point,[In,Out]ref int m);
在使用时,首先定义一个足够大的数组传入到CppToCS_Interpolation中,但是在执行时,C#界面自动闪退;
因为这个地方只使用了这个函数,因此怀疑我这个封装是否正确?如果有,请指出我的错误~
还有就是我这种动态的数组,有其他办法,添加进来么?给定一个大数组,太占内存了;
4 个解决方案
#1
EXPORT是
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif
#2
1. 如果返回的Output大小不定,可以考虑把函数拆分为
两个
1) 返回计算结果的长度或个数;
2)根据1)返回个数分配合适大小的数组,读取结果
2.vs支持 c#和C++ 代码联调,也就是把所有的工程加载
到一个解决方案中,设置项目-“调试”-“启用非托管代码调试”
下断点Debug比猜测原因直接高效的多
两个
1) 返回计算结果的长度或个数;
2)根据1)返回个数分配合适大小的数组,读取结果
2.vs支持 c#和C++ 代码联调,也就是把所有的工程加载
到一个解决方案中,设置项目-“调试”-“启用非托管代码调试”
下断点Debug比猜测原因直接高效的多
#3
好的,我先试试,还有就是我在C++中的double[],在C#应该也是可以用double[]来看的吧~
#4
我试了本地调试,还是直接退出,没有任何错误报错,我觉得可能是我的DLL调用的格式有问题~我再自己看看这块,格式怎么弄;刚接触复杂的dll调用就不行了~
#1
EXPORT是
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif
#2
1. 如果返回的Output大小不定,可以考虑把函数拆分为
两个
1) 返回计算结果的长度或个数;
2)根据1)返回个数分配合适大小的数组,读取结果
2.vs支持 c#和C++ 代码联调,也就是把所有的工程加载
到一个解决方案中,设置项目-“调试”-“启用非托管代码调试”
下断点Debug比猜测原因直接高效的多
两个
1) 返回计算结果的长度或个数;
2)根据1)返回个数分配合适大小的数组,读取结果
2.vs支持 c#和C++ 代码联调,也就是把所有的工程加载
到一个解决方案中,设置项目-“调试”-“启用非托管代码调试”
下断点Debug比猜测原因直接高效的多
#3
好的,我先试试,还有就是我在C++中的double[],在C#应该也是可以用double[]来看的吧~
#4
我试了本地调试,还是直接退出,没有任何错误报错,我觉得可能是我的DLL调用的格式有问题~我再自己看看这块,格式怎么弄;刚接触复杂的dll调用就不行了~