3. 利用CLR C++把本机C++代码包装起来,做一个wrapper。这种方法比较好,而且在设计模式里还有一个专门的名称。首先创建一个C#项目写界面,然后添加一 个CLR C++类库项目和一个本机C++ DLL项目。本机C++ DLL项目里面是算法代码,可以导出类;在CLR C++类库项目里写一个类,私有成员为本机C++ 类的指针(不能用类的实例,因为CLS不支持混合类型),公共成员为本机C++ DLL类中的相应功能。C#调用CLR C++类,CLR C++类再调用本机C++ 类。
第1种方法最简单,而且无论C还是C++编写的dll都可以调用,或者C++上调用C编写的dll;但缺点就是欠缺最外面一层封装,C#端需要进行指针的初始化、new、delete之类的内存操作。
实例:
要在C#代码中调用C++函数,大体的思路是这样的:首先将C++函数写成DLL形式的库,然后在C#中导入DLL中的函数进行调用。具体的代码类似这样:
C++代码:
int StaticElementNumber = 10; extern "C" AFX_API_EXPORT int GetArrayElementNumber() { return StaticElementNumber; }
[DllImport("MFCDll.dll")] public static extern int GetArrayElementNumber(); int ElementNumber = GetArrayElementNumber();其中的细节,比如int和char等数据类型在C++和C#中占用的空间不同等等CLR会自动处理。(主要是通过Marshal类自动处理)
其它文章:
C#调用C++Dll封装时遇到的一系列问题,讲述了怎么实现C++接口到C#的转换
C# 调用 C++ dll文件,讲述了一般调用方法,做了一些实验
C#调用C++ DLL相关问题,详细列出C++到C#的类型转换
您也使用托管C++吗?,讲述了面对复杂的应用需求(并非简单的调用一个函数)时,怎么使用托管C++