在C#中调用C++写的DLL

来源:互联网 发布:ios软件免费下载 编辑:程序博客网 时间:2024/06/06 11:40

平常写程序用的都是C++,C#只是本科学过一些,也没好好学,目前,工作中用C++实现算法后,需要做个界面展示。C#拉界面真是太方便了,所以想用C#做个界面,核心算法由C++写,编成DLL,在界面程序总调用。 

网上有很多博客都讲了C#如何调用C++写的DLL,这里不细说,只是记录一下自己在这过程中学到的一些东西,防止忘记,以后即使忘了,也可以在这里查到。

(1)关于回调函数。算法中用到了回调函数,即在C++程序中要调用C#写的一个函数,采用回调函数的方式,将函数地址传给C++程序。  

这里需要注意的是,由于C#函数默认参数读取方式的是stdcall,而C++是cdecl,所以,在C++中声明函数指针时,应显示的使用stdcall,这样C++程序调用C#的函数时,参数读取方式一致,就不会出错。  

其次,由于需要在C#中声明“函数指针”,这里需要用委托代替函数指针,关于C#中的委托和C++中的函数指针有什么区别,网上有,这里就不介绍了。 

(2)关于extern "C" 在工程中,将C++写的类封装成一个个函数(貌似C#不能直接调用DLL封装的类,故一般先将类中用到的函数封装成一个个函数接口),此时,需在前面加上extern "C",基本作用就是规定编译时,函数名在DLL中的名字(C++由于有重载,因此编译时,DLL中的函数名除了原本函数名外,还有参数的信息)。

我感觉之所以按照C的方式编译函数名,是为了C#调用时,根据函数名找到函数入口(EntryPoint),不然,按照C++编译,函数名称会变,可能找不到(我的猜想)。  

另外,若C++导出DLL用默认的形式,即cdecl,DLLimport中CallingConvention (调用约定)参数应该指明cdecl(默认的WINAPI,即stdcall)。

0 0