问题描述
目的:VS2010中,将一个C++函数代码封装的DLL供C#函数调用描述:在C++代码中,该函数声明为:__declspec(dllexport)boolMatrix_PolyFit(double*x,double*y,intX_Y_Number,intFit_N,double*ks);已经正常生成了dll生成dll的C++工程选了“类库”,把里面自动生成的publicrefclass去掉了,所有函数和函数定义代码都直接拷贝在PolyFit.h文件中,PolyFit.cpp文件是空的。C#中调用时,参照网上的说法在我自己的类中做了dll引用:[DllImport("PolyFit.dll",EntryPoint="Matrix_PolyFit")]publicstaticexternboolMatrix_PolyFit(IntPtrx,IntPtry,intX_Y_Number,intFit_N,IntPtrks);且PloyFit.dll已经拷贝到C#工程的debug文件夹下由于C++函数的参数用了指针,所以在C#中传参数千已经把double[]按如下方法转换为IntPtr:double[]fitX=newdouble[655];GCHandlehX;hX=GCHandle.Alloc(fitX,GCHandleType.Pinned);最后调用时语句为:boolsucessFlag=Matrix_PolyFit(hX.AddrOfPinnedObject(),hY.AddrOfPinnedObject(),655,fitOrder,hKS.AddrOfPinnedObject());编译通过,但是每次运行到这个函数调用时,就报“无法在DLL“PolyFit.dll”中找到名为“Matrix_PolyFit”的入口点”。实在不知道为什么,千辛万苦试了好几天还是没办法,特来求助各位大神!万分感谢!
解决方案
解决方案二:
VC++编译的时候,会对函数名称进行修饰,,,也就是说,你声明是Matrix_PolyFit,但是导出可能是Matrix_PolyFit@******这类的提供的代码不全,不知道你的编译设置,不敢肯定一定是这个问题..你可以用dependencywalker看下函数具体导出名称.就知道了.
解决方案三:
建议将C++中的所有接口函数均以纯C方式导出,方便各种语言环境调用extern"C"{//告诉C+++编译器,扩号里按照C的命名规则编译voidCPP_fun(){.....}}