比如我用c开发了一个testdll.dll的dll文件,则我在c#类的构造函数前可以添加[DllImport("testdll.dll")],就把c开发的动态链接库添加进了c#项目里。
编写动态链接库的过程其实和编写普通C程序差不多少
只不过
把一个整体的C程序,摘出来一部分, 放在独立的一个或者几个C文件中
再把这些C文件打包成dll或者so文件而已。
所以写法上没有特别的
需要注意的是编译。
如果是windows,最好用IDE,创建的时候选动态链接库
如果是gcc, 那么编译的时候 增加编译选项 -fPIC -shared即可。
这是自己平时学习做的笔记,这个动态链接库的知识主要是根据孙鑫老师视频学习的记录的,可能会对大家来说会有点乱,有什么不懂得可以问,另外特别推荐看看孙老师的视频,讲的很清晰。win32.动态链接库(dll)的编写与引用
编写:
首先建个win32 Dynamic-Link Library 类型的空工程,取名Dlll,再添加一个Dlll.Cpp 文件,并在其中编写函数,如:
_declspec(dllexport) int add(int a,int b)//_declspec(dllexport)说明该函数为导出函数
{
return a+b
}
_declspec(dllexport) int subtract(int a,int b)
{
return a-b
}
编译连接后就会在Debug目录下生成一个Dlll.dll和一个lib引入库文件,这也就是我们要的dll文件了。
如果是这样生成的话,引用是在调用该函数前需做如下声明:
extern int add(int a,int b)//可以使用 _declspec(dllimport) int add(int a,int b) 代替,并且效率更高
extern int subtract(int a,int b)//可以使用 _declspec(dllimport) int subtract (int a,int b) 代替,并且效率更高
并将dll和lib文件复制到该工程下,并在VC中的工程- ---->设置----->连接选项中加入上面生成的lib文件,然后就可以使用了。
但为了让使用者更方便的调用dll中的函数,我们可以在dll工程中建一个头文件,里面包含导出函数,如下:
头文件内容:
_declspec(dllimport) int add(int a,int b)
_declspec(dllimport) int subtract (int a,int b)
然后使用时只需包含这个头文件就行了,不必再声明了。并且由于在头文件中已经使用_declspec(dllimport)声明了,所以在cpp实现文件中不必再声明了。
另外为了使用方便也可以定义一个宏:
#define DLL1_API _ declspec(dllimport)
或:
#ifdef DLL_API
#else
#define DLL1_API _ declspec(dllimport)
#endif
此外为了防止编译器自动修改函数或类的名字可以将方面:#define DLL1_API _ declspec(dllimport)
这句声明改成: #define DLL1_API extern "C" _ declspec(dllimport)
但这种有一个缺陷是:不能导出类的成员函数,并且当函数的调用约定约定发生改变时,函数名还是会改变。
所以为了解决这种问题,我们定义一个模块定义文件,即.def文件 ,然后加入到工程中。
内容为:
LIBRARY Dll1//名字为生成的dll文件名
EXPORTS
add //可以写成 add @2 为add函数编号为2,下面获取地址时可以用到
subtract
另外在dll中也可以导出类
以上都是使用隐式调用dll文件,也可以动态加载dll文件:
HINSTANCE hInst
hInst =LoadLibrary("Dll1.dll")
typedef int (*ADDPROC)(int a,int b)
ADDPROC Add=(ADDPROC)GetProcAddress(hInst,"add")
if(!Add)
{
MessageBox("获取函数地址失败!")
return
}
int c=Add(5,3)
由于是动态调用,所以不需要头文件,不需要lib文件,只需一个dll文件就行了,并且很省内存。
当然也可以根据编号来获取函数的地址:
把上面获取地址的那句改为:
ADDPROC Add=(ADDPROC)GetProcAddress(hInst,MAKEINTRESOURCE(1))
另外dll文件还有一个可选的如可函数 DllMain
调用完后,如果不再调用了,可以使用FreeLibrary(hInst)来释放动态链接库。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)