怎么在C#中添加用C语言开发的动态链接库dll文件(vs2010)

怎么在C#中添加用C语言开发的动态链接库dll文件(vs2010),第1张

在c#类里添加[DllImport("dll名.dll")]即可:

比如我用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)来释放动态链接库。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11635043.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存