首先是我的目的:
 在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#界面自动闪退;
因为这个地方只使用了这个函数,因此怀疑我这个封装是否正确?如果有,请指出我的错误~
还有就是我这种动态的数组,有其他办法,添加进来么?给定一个大数组,太占内存了;

解决方案 »

  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.   


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