DLL文件到底是什么,它们如何工作?

时间:2020-03-06 14:38:04  来源:igfitidea点击:

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。程序使用GetProcAddress加载函数或者使用LoadResource加载资源。

进一步阅读:

请检查MSDN或者Wikipedia以进一步阅读。也是这个答案的来源。

DLL(动态链接库)包含一个或者多个应用程序或者服务使用的资源。它们可以包含类,图标,字符串,对象,接口,以及除UI以外几乎所有开发人员需要存储的所有内容。

http://support.microsoft.com/kb/815065

A DLL is a library that contains code
  and data that can be used by more than
  one program at the same time. For
  example, in Windows operating systems,
  the Comdlg32 DLL performs common
  dialog box related functions.
  Therefore, each program can use the
  functionality that is contained in
  this DLL to implement an Open dialog
  box. This helps promote code reuse and
  efficient memory usage.
  
  By using a DLL, a program can be
  modularized into separate components.
  For example, an accounting program may
  be sold by module. Each module can be
  loaded into the main program at run
  time if that module is installed.
  Because the modules are separate, the
  load time of the program is faster,
  and a module is only loaded when that
  functionality is requested.
  
  Additionally, updates are easier to
  apply to each module without affecting
  other parts of the program. For
  example, you may have a payroll
  program, and the tax rates change each
  year. When these changes are isolated
  to a DLL, you can apply an update
  without needing to build or install
  the whole program again.

http://en.wikipedia.org/wiki/Dynamic-link_library

DLL文件包含一个导出表,该表是可以由调用程序查找的符号列表。这些符号通常是具有C调用约定(__stcall)的函数。导出表还包含函数的地址。

使用此信息,即使在编译时没有访问DLL,调用程序也可以在DLL中调用函数。

引入动态链接库具有更多信息。

DLL(动态链接库)和SL(共享库,在UNIX下等效)仅是可执行代码的库,可以在加载时动态链接到可执行文件中。

静态库在编译时插入到可执行文件中,并从那时开始进行修复。它们增加了可执行文件的大小,无法共享。

动态库具有以下优点:

1 /它们是在运行时而不是编译时加载的,因此它们可以独立于可执行文件进行更新(我们在Windows中看到的所有奇特的窗口和对话框都来自DLL,因此无需我们就可以更改应用程序的外观必须重写它)。

2 /由于它们是独立的,因此可以在多个可执行文件之间共享代码,从而节省了内存,因为如果我们使用单个DLL运行100个应用程序,则内存中可能只有该DLL的一个副本。

它们的主要缺点是优势#1,使DLL独立于应用程序更改可能会导致应用程序停止工作或者以奇怪的方式开始运行。 DLL版本控制在Windows下往往无法很好地管理,这导致了古怪的" DLL Hell"。

假设我们正在制作一个使用库中某些功能的可执行文件。

如果我们使用的库是静态的,则链接程序将直接从库中复制这些函数的目标代码,并将它们插入可执行文件中。

现在,如果运行了此可执行文件,它具有所需的一切,因此可执行文件加载器仅将其加载到内存中并运行它。

如果该库是动态的,则链接器将不会插入目标代码,而是会插入一个存根,该存根基本上表示此函数位于此DLL中的此位置。

现在,如果运行了该可执行文件,则可执行文件的某些位(即存根)将丢失,因此加载程序将通过可执行文件来修复丢失的存根。仅在解决所有存根之后,才允许运行该可执行文件。

若要查看此操作,请删除或者重命名DLL,并观察尝试运行可执行文件时加载程序将如何报告缺少的DLL错误。

因此,名称动态链接库(Dynamic Link Library)是链接过程的一部分,由可执行的加载程序在运行时动态完成。

最后一点,如果我们不链接到DLL,则链接器将不会插入任何存根,但是Windows仍提供GetProcAddress API,该API允许我们在可执行文件启动后很长一段时间就加载执行DLL函数的入口点。

什么是DLL?

DLL文件是二进制文件,可以包含可执行代码和资源(例如图像等)。与应用程序不同,它们无法直接执行,但是应用程序将在需要时(或者在启动过程中一次加载)将它们加载。

他们重要吗?

大多数应用程序将在启动时加载所需的DLL文件。如果找不到任何一个,系统将完全无法启动该过程。

DLL文件可能需要其他DLL文件

以与应用程序需要DLL文件相同的方式,DLL文件可能依赖于其他DLL文件本身。如果找不到依赖链中的这些DLL文件之一,则该应用程序将不会加载。使用任何依赖行者工具(例如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。