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

问题描述 投票:204回答:9

DLL文件如何工作?其中似乎有很多,但我不知道它们是什么或它们如何工作。

那么,他们怎么处理?

windows winapi dll
9个回答
263
投票

什么是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加载资源。

进一步阅读:

请检查MSDNWikipedia以进一步阅读。也是这个答案的来源。


35
投票

什么是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

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

如果您使用的库是静态

,则链接器将直接从库中复制这些函数的目标代码,并将它们插入可执行文件中。

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

如果库是动态

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

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

要查看实际情况,请删除或重命名DLL,并在尝试运行可执行文件时观察加载程序如何报告缺少的DLL错误。

因此命名为Dynamic Link Library

,链接过程的一部分是由可执行程序在运行时动态完成的。

最后一点,如果您不链接到DLL,则链接器将不会插入任何存根,但是Windows仍然提供了GetProcAddress

API,该API可让您长时间加载执行DLL函数的入口点可执行文件启动后。

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

静态库在编译时插入到可执行文件中,并且从那时开始是固定的。它们增加了可执行文件的大小,因此无法共享。

动态库具有以下优点:

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

2 //因为它们是独立的,因此代码可以在多个可执行文件之间共享-这样可以节省内存,因为如果您使用单个DLL运行100个应用,则内存中可能只有一个DLL副本。

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

DLL文件包含一个导出表

,这是可以由调用程序查找的符号列表。这些符号通常与C calling convention__stcall)一起使用。导出表还包含函数的地址。

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

[Introducing Dynamic Link Libraries有更多信息。

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

DLL是一个包含代码的库以及可以被一个程序在同一时间。对于例如,在Windows操作系统中,Comdlg32 DLL执行常见对话框相关功能。因此,每个程序都可以使用包含的功能这个DLL来实现打开对话框框。这有助于促进代码重用和有效的内存使用。

通过使用DLL,程序可以模块化成单独的组件。例如,会计程序可以按模块出售。每个模块可以是在运行时加载到主程序中时间(如果已安装该模块)。由于模块是分开的,因此程序的加载时间更快,并且只有在需要功能。

此外,更新更容易适用于每个模块而不会影响程序的其他部分。对于例如,您可能有工资单程序,税率各不相同年。当这些变化被隔离时到DLL,您可以应用更新无需构建或安装再次整个程序。

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

DLL是文件扩展名,被称为“动态链接库”文件格式,用于保存Windows程序的多个代码和过程。软件和游戏基于DLL文件运行;创建DLL文件是为了使多个应用程序可以同时使用它们的信息。

如果要获取有关DLL文件的更多信息或遇到任何错误,请阅读以下文章。https://www.bouncegeek.com/fix-dll-errors-windows-586985/

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

根据Microsoft

(DLL)动态链接库是包含运行应用程序所需的数据,代码或资源的文件。这些是Windows生态系统创建的文件,可以在两个或多个应用程序之间共享。

当程序或软件在Windows上运行时,应用程序的大部分工作方式取决于程序的DLL文件。例如,如果特定应用程序具有多个模块,则每个模块之间的交互方式由Windows DLL文件确定。

如果要详细说明,请查看这些有用的资源

[What are dll filesAbout Dll files


12
投票

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


11
投票

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

静态库在编译时插入到可执行文件中,并且从那时开始是固定的。它们增加了可执行文件的大小,因此无法共享。


10
投票

DLL文件包含一个导出表

,这是可以由调用程序查找的符号列表。这些符号通常与C calling convention__stcall)一起使用。导出表还包含函数的地址。

6
投票

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

DLL是一个包含代码的库以及可以被一个程序在同一时间。对于例如,在Windows操作系统中,Comdlg32 DLL执行常见对话框相关功能。因此,每个程序都可以使用包含的功能这个DLL来实现打开对话框框。这有助于促进代码重用和有效的内存使用。


2
投票

DLL是文件扩展名,被称为“动态链接库”文件格式,用于保存Windows程序的多个代码和过程。软件和游戏基于DLL文件运行;创建DLL文件是为了使多个应用程序可以同时使用它们的信息。

如果要获取有关DLL文件的更多信息或遇到任何错误,请阅读以下文章。https://www.bouncegeek.com/fix-dll-errors-windows-586985/


1
投票

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


0
投票

根据Microsoft

(DLL)动态链接库是包含运行应用程序所需的数据,代码或资源的文件。这些是Windows生态系统创建的文件,可以在两个或多个应用程序之间共享。

© www.soinside.com 2019 - 2024. All rights reserved.