C#调用C++函数DLL

时间:2023-01-08 18:59:47
首先是我的目的:
 在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比猜测原因直接高效的多

#3


好的,我先试试,还有就是我在C++中的double[],在C#应该也是可以用double[]来看的吧~

#4


引用 2 楼 xian_wwq 的回复:
1. 如果返回的Output大小不定,可以考虑把函数拆分为
两个
   1) 返回计算结果的长度或个数;
   2)根据1)返回个数分配合适大小的数组,读取结果

2.vs支持 c#和C++ 代码联调,也就是把所有的工程加载
到一个解决方案中,设置项目-“调试”-“启用非托管代码调试”
下断点Debug比猜测原因直接高效的多


我试了本地调试,还是直接退出,没有任何错误报错,我觉得可能是我的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比猜测原因直接高效的多

#3


好的,我先试试,还有就是我在C++中的double[],在C#应该也是可以用double[]来看的吧~

#4


引用 2 楼 xian_wwq 的回复:
1. 如果返回的Output大小不定,可以考虑把函数拆分为
两个
   1) 返回计算结果的长度或个数;
   2)根据1)返回个数分配合适大小的数组,读取结果

2.vs支持 c#和C++ 代码联调,也就是把所有的工程加载
到一个解决方案中,设置项目-“调试”-“启用非托管代码调试”
下断点Debug比猜测原因直接高效的多


我试了本地调试,还是直接退出,没有任何错误报错,我觉得可能是我的DLL调用的格式有问题~我再自己看看这块,格式怎么弄;刚接触复杂的dll调用就不行了~