用托管类库的方式在C#中使用C++编写的类(设计流程)
对于C++编写的导出类(DLL动态链接库,输出符号),可用托管类库的方式在C#中使用。当然,C#也可以调用C++的dll中的函数(非采用调用类的成员函数的方法),但灵活性较差。
对于C#使用导出C++类时,需要完成三部分编程(参考“一”中的1):
(1)C++类的编程实现:建立Win32类型的Win32项目(可以是控制台程序,在设置项目时需选择”输出符号”),需编译可生成非托管的动态链接库(NativeDll.dll和NativeDll.lib)。
关键点:因为生成dll时需要同时导出lib文件,在头文件中需有如下宏定义
#ifndef LX_DLL_CLASS_EXPORTS
#define LX_DLL_CLASS __declspec(dllexport) //后面类的定义中有使用到LX_DLL_CLASS
#else
#define LX_DLL_CLASS __declspec(dllimport)
#endif
此外,对于需要导出的类,需要在定义类时在类名前加上LX_DLL_CLASS:
class LX_DLL_CLASS 导出类名
{ };
此外:项目“属性”->“C/C++”->“代码生成”中的“运行库”,如果选择“多线程DLL”的话,则代码中不允许出现cout等屏幕输出语句,另外,要求所有类的所有函数都要有定义。此外,如果类中不能有vector类型的子对象。选择“多线程DLL调试”的话,则不受上述约束,但生成的dll可能不合适。
(2)托管类库的编程实现:建立CLR类型的类库项目。设置VC++的目录之库目录,使之包含NativeDll.lib所在的目录,在连接器-输入-附加依赖项中,添加库NativeDll.lib。需要将(1)中C++类的头文件(接口定义)include到本项目中;最好把(1)中生成的动态链接库存到当前项目的工作目录下。处理方法是:用托管C++将(1)所实现的C++类给封装一下,然后再提供给C#来使用。编译运行,即可生成托管的类库(ManageCppDll.dll)
关键点:需要(1)所生成的dll为“多线程DLL”的运行库。
(3)C#类型的Windows项目(可以为控制台应用程序):通过(2)生成的托管类库来使用(1)实现的类。需要在项目中(引用)添加托管类库ManageCppDll.dll的引用,然后按托管类的正常使用方式即可调用ManageCppDll中的类的属性和方法。
关键点:将(1)、(2)中生成的dll和lib文件都拷贝到C#文件夹的bin/debug下,再在项目中的“引用”添加托管类库ManageCppDll.dll(2中生成的dll)的引用。
可能出现的问题:
release编译好的两个dll拷贝到C#文件夹的bin/debug后,c#工程编译出错问题(问题1:无效的程序;问题2:找不到指定模块)。
解决办法:(1)编译两个dll时需设置为x86目标平台,编译C#工程也是如此;(解决第1个问题)
(2)如果要编译release版的C#工程,因为设为x86目标平台,因此,两个dll文件应该拷贝到C#工程文件夹的bin/x86/release下;如编译debug版本,则拷贝到bin/x86/debug下。(解决第2个问题)