C#调用C++函数DLL

lionelmessiCODE 2018-03-08 03:00:28
首先是我的目的:
在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#界面自动闪退;
因为这个地方只使用了这个函数,因此怀疑我这个封装是否正确?如果有,请指出我的错误~
还有就是我这种动态的数组,有其他办法,添加进来么?给定一个大数组,太占内存了;
...全文
237 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lionelmessiCODE 2018-03-08
  • 打赏
  • 举报
回复
引用 2 楼 xian_wwq 的回复:
1. 如果返回的Output大小不定,可以考虑把函数拆分为 两个 1) 返回计算结果的长度或个数; 2)根据1)返回个数分配合适大小的数组,读取结果 2.vs支持 c#和C++ 代码联调,也就是把所有的工程加载 到一个解决方案中,设置项目-“调试”-“启用非托管代码调试” 下断点Debug比猜测原因直接高效的多
我试了本地调试,还是直接退出,没有任何错误报错,我觉得可能是我的DLL调用的格式有问题~我再自己看看这块,格式怎么弄;刚接触复杂的dll调用就不行了~
lionelmessiCODE 2018-03-08
  • 打赏
  • 举报
回复
好的,我先试试,还有就是我在C++中的double[],在C#应该也是可以用double[]来看的吧~
xian_wwq 2018-03-08
  • 打赏
  • 举报
回复
1. 如果返回的Output大小不定,可以考虑把函数拆分为 两个 1) 返回计算结果的长度或个数; 2)根据1)返回个数分配合适大小的数组,读取结果 2.vs支持 c#和C++ 代码联调,也就是把所有的工程加载 到一个解决方案中,设置项目-“调试”-“启用非托管代码调试” 下断点Debug比猜测原因直接高效的多
lionelmessiCODE 2018-03-08
  • 打赏
  • 举报
回复
EXPORT是
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧