C#调用C++——CLR方式
一直是在写C#,最近接触到的项目中有C#调用C++接口的逻辑,自己学习了下,写个步骤日志,C#掉用C++的托管代码
项目分三个项目:1、底层C++动态库项目,2、中间层的CLR项目,3、上层的C#项目
1. 底层C++动态库项目,
1、新建一个C++动态链接库(Dll)项目,获取新建了其他的项目后在项目属性中将配置类型改为动态库(.dll),具体如下截图
2、然后编写C++代码,比如我这里需要在C++中实现两数相加和相减得到结果的的功能,这里在头文件(.h文件)中定义两个方法Add和Mul,在源文件(.cpp文件)中实现方法Add和Mul。
3、导出C++的函数和变量,这个是非常重要的一步,导出是为了让其他的应用程序能够调用这些函数和变量,这里为了方便定义一个导出的宏,然后后续导出,
这里__declspec(dllexport)修饰符指示编译器和链接器从DLL 导出函数或变量,以便其他应用程序可以使用它,在ExprotDll.h中
2、中间层的CLR项目
1、新建一个C++的CLR项目,CLR项目就是为了面向.net,可以实现.net和C++代码之间可以互相操作。这种项目属性中都是带有公共语言运行时支持和创建时可以选择.net的目标框架(面向.netFramework的,最新的.net Core后的貌似没有这个)
2、配置中间层调用C++动态链接库,这里需要配置包含目录和库目录两个。
包含目录是为了引入C++动态链接库项目的代码,以便写代码时能够在此项目中引入,进而找到动态链接库项目中方法或变量,这里指向的是动态链接库项目的源码所在目录。库目录是引用C++动态链接库项目生成的DLL和Lib,(一般放置在C#项目Debug目录下,后期因为C#程序要加载,尽可能程序库都放置在C#加载的目录下)。
3、编写相应的代码,用来调用底层C++项目封装好的方法或变量。
3、C#上层项目
这个就比较简单了。新建一个C#的项目,比如Web,控制台项目,WPF项目等等。
然后在项目中右键添加项目引用,引入中间层CLR项目(或者其生成的Dll),然后在此项目中就能够找到并使用中间层CLR项目中定义的方法和变量,从而最终调用到C++底层的方法或变量。这里需要注意的是映入了中间层的CLR项目还不够,还需要将底层的C++动态库项目的DLL拷贝到C#项目的运行目录下。不然会报找不到依赖项的错误。
最后,还有一种比较直接的CLR封装调用C++函数的方式,在前面的基数上省略掉了包含目录和库目录的配置,这种如果C++的底层代码逻辑有更新的话,需要每次都去手动更新。 大致步骤就是:
1:第一步也是创建C++的动态库项目,
2、第二步创建C++的CLR项目,将第一步中需要调用的函数的头文件(.h后缀的文件)和第一步的库文件(.lib文件)复制到CLR项根目录下。注意这里如果C++代码有变动,这里每次也要耕者重新替换。
3、创建C#的项目,C#项目种引用CLR项目。