DLL文件究竟是如何工作的?似乎有很多它们,但我不知道它们是什么或它们是如何工作的.
那么,与他们的交易是什么?
什么是DLL?
动态链接库(DLL)类似于EXE,但它们不能直接执行.它们类似于Linux/Unix中的.so文件.也就是说,DLL是MS的共享库实现.
DLL与EXE非常相似,文件格式本身也是一样的.EXE和DLL都基于可移植可执行文件(PE)文件格式.DLL还可以包含COM组件和.NET库.
DLL包含什么?
DLL包含EXE或其他DLL使用的函数,类,变量,UI和资源(如图标,图像,文件......).
图书馆类型:
在几乎所有操作系统上,有两种类型的库.静态库和动态库.在Windows中,文件扩展名如下:静态库(.lib)和动态库(.dll).主要区别在于静态库在编译时链接到可执行文件; 而动态链接库直到运行时才链接.
有关静态和动态库的更多信息:
您通常不会在计算机上看到静态库,因为静态库直接嵌入到模块(EXE或DLL)中.动态库是一个独立的文件.
DLL可以随时更改,只在EXE显式加载DLL时才在运行时加载.一旦在EXE中编译静态库,就无法更改它.可以单独更新DLL,而无需更新EXE本身.
加载DLL:
程序在启动时通过Win32 API LoadLibrary加载DLL,或者当它是另一个DLL的依赖项时加载DLL.程序使用GetProcAddress加载函数或LoadResource加载资源.
进一步阅读:
请查看MSDN或维基百科以进一步阅读.也是这个答案的来源.
什么是DLL?
DLL文件是二进制文件,可以包含可执行代码和资源,如图像等.与应用程序不同,这些文件不能直接执行,但应用程序将在需要时(或在启动期间一次性加载)加载它们.
它们重要吗?
大多数应用程序将加载启动时所需的DLL文件.如果找不到任何这些,系统将根本无法启动该过程.
DLL文件可能需要其他DLL文件
与应用程序需要DLL文件的方式相同,DLL文件可能依赖于其他DLL文件本身.如果未找到依赖链中的这些DLL文件之一,则不会加载应用程序.使用任何依赖性walker工具(如Dependency Walker)可以轻松调试.
系统文件夹中有这么多
大多数系统功能以DLL文件的形式暴露给用户程序,因为它们是共享代码/资源的标准形式.每个功能都分别保存在不同的DLL文件中,以便只加载所需的DLL文件,从而减少系统上的内存限制.
已安装的应用程序也使用DLL文件
如上所述,DLL文件也成为物理上分离功能的一种形式.好的应用程序也会尝试在绝对需要之前不加载DLL文件,这会降低内存需求.这也会导致应用程序附带大量DLL文件.
DLL地狱
但是,有时系统升级会在共享DLL文件与需要它们的程序之间存在版本不匹配时中断其他程序.系统检查点和DLL缓存等已经从M $中解决了这个问题..NET平台可能根本不会遇到这个问题.
我们怎么知道DLL文件里面有什么?
你必须使用像DUMPBIN或Dependency Walker这样的外部工具,它不仅会显示DLL文件中包含哪些公开可见的函数(称为导出),还会显示它需要的其他DLL文件以及从这些DLL文件导出哪个DLL文件依赖于.
我们如何创建/使用它们?
请参阅供应商提供的编程文档.对于C++,请参阅MSDN中的LoadLibrary.
假设您正在创建一个使用库中的某些函数的可执行文件.
如果您使用的库是静态的,链接器将直接从库中复制这些函数的目标代码,并将它们插入到可执行文件中.
现在,如果运行此可执行文件,它具有所需的一切,因此可执行加载程序只是将其加载到内存中并运行它.
如果库是动态的,链接器将不会插入目标代码,而是会插入一个存根,该存根基本上表示此函数位于此DLL中的此DLL位置.
现在,如果运行此可执行文件,则缺少可执行文件的位(即存根),因此加载程序会通过可执行文件修复缺少的存根.只有在解析了所有存根之后才允许运行可执行文件.
要查看此操作,请删除或重命名DLL,并在尝试运行可执行文件时观察加载程序如何报告缺少的DLL错误.
因此,名称为动态链接库,链接过程的一部分由可执行加载程序在运行时动态完成.
最后一点,如果你没有链接到DLL,那么链接器就不会插入存根,但是Windows仍然提供了GetProcAddress API,它允许你在可执行文件启动很久之后加载执行DLL函数入口点.
DLL(动态链接库)和SL(共享库,在UNIX下等效)只是可执行代码库,可以在加载时动态链接到可执行文件中.
静态库在编译时插入到可执行文件中,并从该点开始修复.它们会增加可执行文件的大小,无法共享.
动态库具有以下优点:
1 /它们是在运行时而不是编译时加载的,因此它们可以独立于可执行文件进行更新(您在Windows中看到的所有那些花哨的窗口和对话框都来自DLL,因此您的应用程序的外观可以在没有您的情况下更改不得不重写它).
2 /因为它们是独立的,所以代码可以在多个可执行文件之间共享 - 这节省了内存,因为如果你使用单个DLL运行100个应用程序,则内存中可能只有一个DLL副本.
它们的主要缺点是优势#1 - 让DLL独立更改您的应用程序可能会导致您的应用程序停止工作或以奇怪的方式开始表现.在Windows下,DLL版本控制往往不能很好地管理,这导致了古怪的"DLL Hell".
DLL文件包含导出表,该表是可由调用程序查找的符号列表.这些符号通常具有C调用约定(__stcall).导出表还包含函数的地址.
有了这些信息,调用程序就可以调用DLL中的函数,即使它在编译时无法访问DLL.
介绍动态链接库有一些更多的信息.
http://support.microsoft.com/kb/815065
DLL是一个包含可以由多个程序同时使用的代码和数据的库.例如,在Windows操作系统中,Comdlg32 DLL执行常见的对话框相关功能.因此,每个程序都可以使用此DLL中包含的功能来实现"打开"对话框.这有助于促进代码重用和高效的内存使用.
通过使用DLL,程序可以模块化为单独的组件.例如,会计程序可以按模块出售.如果安装了该模块,则可以在运行时将每个模块加载到主程序中.由于模块是独立的,因此程序的加载时间更快,并且仅在请求该功能时才加载模块.
此外,更新更容易应用于每个模块,而不会影响程序的其他部分.例如,您可能有薪资计划,税率每年都会发生变化.当这些更改与DLL隔离时,您可以应用更新,而无需再次构建或安装整个程序.
http://en.wikipedia.org/wiki/Dynamic-link_library