VS 中的 lib 和 dll 的区别和使用

在 vs/c# 项目开发中,经常会遇到 lib 和 dll 文件,而且创建工程项目以及工程项目打包时也是必须要面对的,所以有必要掌握 lib 和 dll 的区别和使用。

  • 静态库:在链接步骤中,连接器将库文件取得所需的代码,复制到生成的可执行文件中,这种库叫做静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令全部被直接包含在最终生成的exe文件中。在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件。

  • 动态库:动态库链接是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行的文件,动态库提供一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个DLL中,该DLL中包含一个或者多个已经被编译,链接并使用它们的进程分开存储的函数,在vs中新建生成动态库的工程,编译成功后,产生一个.lib和一个.dll文件。

  • 静态库的lib:该lib包含函数的代码本身(包括函数的索引,也包括实现),在编译 的时候将代码加入程序当中

  • 动态库的lib:该lib包含了函数所在的DLL文件和文件中函数位置的信息,函数实现代码由运行的时候加载在进程空间中DLL提供,总之,lib是编译的时候用到的,如果完成源代码的编译,只需要lib,如果要使得动态库的程序运行起来,只需要dll。

静态库.a(win下是lib) 和动态库.so(win下是.dll),所谓静态,动态是指链接,回顾下,将一个程序编译成可执行的步骤:

静态库在程序编译的时候会被链接到目标代码中,程序运行的时候不需要该静态库

静态库特点:

静态库对函数库的链接是放在编译期完成的,程序在运行的时候与函数库再无瓜葛,移植方便。

缺点:浪费空间与资源,因为所有相关的目标文件与牵扯到的函数库会被合成一个可执行的文件。

是静态库对程序的更新,部署和发布会带来麻烦,如果静态库更新,所有使用它的应用程序程序都需要重新编译,发布给用户。

动态库特点:

动态库把一些库函数的链接载入推迟到程序运行的时期,可以实现进程之间的资源共享。

将实现进程之间的资源共享,将一些程序升级变得简单。甚至可以真正做到链接载入完全由程序代码中控制(显示调用)

lib 的调用

c# 不能直接调用 lib 库,需要将其打包为 dll 才能调用

dll 的调用

将 dll 文件拷贝到工程 debug 文件下即可(如果不拷贝,编译链接不报错,运行报错:无法找到***.dll)

工程调用 dll 方法举例

[DllImport("user32.dll", EntryPoint="MessageBoxA")]
static extern int MsgBox(int hWnd, string msg, string caption, int type);
作者:Binge
本文版权归作者和博客园共有,转载必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/binbingg/p/14134619.html