.net core 调用c dll_用C++生成一个简单的DLL文件VS2008
大家好,我是孤帆冒雨行,最近刚入职到一家软件公司从事C++开发工作,在学校学习的编程内容到了工作中是远远不够用的,所以开始了自学之路,但由于我不是计算机科班出身的,所以这条路任重而道远。大家看到我的教程是一步步的来,从如何创建一个项目开始,请大家不要吃惊。
从接触简单的项目开始学起吧,先使用C++创建一个简单的DLL,到后面可以用C++进行调用,因为后面的工作中也需要调用别的公司的DLL。
一、动态链接库(DLL)简介
动态链接库英文为DLL,是Dynamic Link Library的缩写。DLL是一个包含可由多个程序,同时使用的代码和数据的库。在Windows中,这种文件被称为应用程序拓展。例如,在 Windows 操作系统中,Comdlg32.dll 执行与对话框有关的常见函数。因此,每个程序都可以使用该 DLL 中包含的功能来实现“打开”对话框。这有助于避免代码重用和促进内存的有效使用。 通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。例如,一个记账程序可以按模块来销售。可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。[1]
二、DLL生成的两种方式
在C++中,dll的生成主要有两种方法:一是使用__declspec(dllexport) 创建dll,二是使用模块定义(.def)文件创建dll。
方法1: 使用 __declspec(dllexport) 来创建dll
__declspec是Microsoft VC中专用的关键字,它配合着一些属性可以对标准C/C++进行扩充。__declspec关键字应该出现在声明的前面。
__declspec(dllexport)用于Windows中的动态库中,声明导出函数、类、对象等供外面调用,省略给出.def文件。即将函数、类等声明为导出函数,供其它程序调用,作为动态库的对外接口函数、类等。
1.创建一个MyDLL项目
首先我们选择创建项目,项目类型选择Visual C++ -> Win32,模板选择Win32项目,在合适的位置创建一个名为MyDLL的项目,单击确定并在弹出的向导中点击下一步。
应用程序类型选择DLL,附加选项选中空项目,单击完成。
在解决方案资源管理器中的源文件上单击右键选择添加->新建项,创建一个名为MyDLL的.cpp文件。
再以同样的方法在头文件上单击右键添加->新建项,创建一个名为MyDLL的.h文件。
2.添加代码到文件中
复制或输入以下代码到MyDLL.cpp文件中。
//MyDLL.cpp#define DLL_EXPORT#include "MyDLL.h"int add(int a, int b){ return a + b;}int substract(int a, int b){ return a - b ;}
复制或输入以下代码到MyDLL.h文件中
//MyDLL.h#ifdef DLL_EXPORT //如果在工程里已经添加预定义宏 #define MYDLL_EXPORT extern "C" __declspec(dllexport) //那DLLEXPORT就指代__declspec(dllexport) 用于dll的导出#else //当工程中不包含DLL_EXPORTS预定义时 #define MYDLL_EXPORT extern "C" __declspec(dllimport) //DLLEXPORT 就指代__declspec(dllimport)#endif//extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码MYDLL_EXPORT int add(int a, int b);MYDLL_EXPORT int sub(int a, int b);
3.生成解决方案
在解决方案资源管理器中的解决方案"MyDLL"上单击右键,选择生成解决方案,或者在编写完代码后直接按F7生成解决方案。
4.找到生成的dll文件
接下来就可以在你创建的项目文件夹下的Debug文件夹中找到你生成的MyDLL.dll文件,以及静态库文件MyDLL.lib文件了。
我们使用Depends软件来查看我们刚刚生成的dll文件,在Depends软件中打开我们刚刚生成的dll文件,或者拖动到软件中,我们就可以看到其中我们编写的add和sub功能了。
注:Depends软件下载及使用方法请自行百度。
方法2: 使用模块定义(.def)文件创建dll
.def文件(模块定义文件)是包含一个或多个描述各种DLL属性的Module语句的文本文件。.def文件或__declspec(dllexport)都是将公共符号导入到应用程序或从DLL导出函数。如果不提供__declspec(dllexport)导出DLL函数,则DLL需要提供.def文件。
1.创建一个MyDLL项目
与刚才的方法一样创建一个MyDLL项目,但不同的是,我们不用再创建一个MyDLL.h的头文件,而是在源文件中创建一个.def的模块定义文件。具体操作为,在解决方案资源管理器中的源文件上单击右键,选择添加->新建项,新建一个名为MyDLL的.def文件。
2.添加代码到文件中
复制或输入以下代码到MyDLL.cpp文件中。
//MyDLL.cppint add(int a, int b){ return a + b;}int sub(int a, int b){ return a - b ;}
复制或输入以下代码到MyDLL.def文件中。
LIBRARY "MyDLL"EXPORTSadd @2sub @1
其中LIBRARY语句用于指定动态链接库的名称,EXPORTS指明需要导出的函数,其中@加数字为导出函数的顺序,顺序可自行修改,也可以不加@数字,则导出的为默认顺序。
3.生成解决方案
以上述同样的方法生成解决方案,这里不再赘述。
4.查看生成的dll文件
在同样的位置找到刚刚生成的dll文件,并使用Depends软件来查看,这回生成的函数中我们可以注意到,函数的顺序号改变了,sub为1,add为2,与我们刚刚在.def模块定义文件中定义的一样。
以上就是使用VS2008 C++生成DLL动态库的两种方法,如果有内容写的不全或者不好的地方,请大家指正,或者大家有什么问题也欢迎留言讨论。
对于DLL调用的方式,我们下期再讲,感兴趣的同学可以先自行尝试。
参考资料:
[1]百度百科——.dll
https://baike.baidu.com/item/.dll/2133451?fr=aladdin#2
[2]extern “C”的作用详解
https://www.cnblogs.com/xiangtingshen/p/10980055.html
[3]__declspec(dllexport)与__declspec(dllimport)
https://blog.csdn.net/huangyimo/article/details/81748939