什么是DLL文件,以及它们是如何工作的?

DLL文件如何工作? 似乎有很多这样的人,但是我不知道他们是什么或者他们是如何工作的。

那么和他们有什么关系?

什么是DLL?

dynamic链接库(DLL)就像EXE,但它们不能直接执行。 它们与Linux / Unix中的.so文件类似。 也就是说,DLL是MS的共享库的实现。

DLL非常像EXE,文件格式本身是相同的。 EXE和DLL都基于可移植可执行文件(PE)文件格式。 DLL也可以包含COM组件和.NET库。

什么是DLL包含?

DLL包含EXE或其他DLL使用的函数,类,variables,UI和资源(如图标,图像,文件等)。

图书馆的types:

在几乎所有的操作系​​统上,都有两种types的库。 静态库和dynamic库。 在Windows中,文件扩展名如下所示:静态库(.lib)和dynamic库(.dll)。 主要区别在于静态库在编译时链接到可执行文件; 而dynamic链接库在运行时才会被链接。

更多关于静态和dynamic库:

您通常不会在计算机上看到静态库,因为静态库直接embedded到模块(EXE或DLL)中。 dynamic库是一个独立的文件。

一个DLL可以在任何时候被改变,并且只在EXE显式加载DLL的时候被加载。 一旦在EXE中编译了静态库,就无法更改它。 DLL可以单独更新而不更新EXE本身。

加载一个DLL:

一个程序在启动时通过Win32 API LoadLibrary加载DLL,或者当它是另一个DLL的依赖时。 一个程序使用GetProcAddress来加载一个函数或LoadResource来加载一个资源。

进一步阅读:

请检查MSDN或维基百科进一步阅读。 也是这个答案的来源。

什么是DLL?

DLL文件是可以包含可执行代码和图像等资源的二进制文件。与应用程序不同,应用程序不能直接执行,但应用程序会在需要时(或在启动时一次全部加载)加载它们。

他们重要吗?

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

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

与应用程序需要DLL文件的方式相同,DLL文件可能依赖于其他DLL文件本身。 如果没有find依赖关系链中的这些DLL文件之一,则应用程序将无法加载。 这是使用任何依赖沃克工具,如Dependency Walker轻松debugging。

系统文件夹中有很多这样的文件

大多数系统function以DLL文件的forms暴露给用户程序,因为它们是共享代码/资源的标准forms。 每个function都分开保存在不同的DLL文件中,以便只加载所需的DLL文件,从而减less系统上的内存限制。

安装的应用程序也使用DLL文件

如上所述,DLL文件也成为物理分离function的一种forms。 良好的应用程序也尝试不加载DLL文件,直到他们绝对需要,这减less了内存需求。 这也导致应用程序出现大量的DLL文件。

DLL地狱

但是,当共享DLL文件和需要它们的程序之间存在版本不匹配时,有时系统升级经常打破其他程序。 系统检查点和DLLcaching等已经从M $开始解决这个问题。 .NET平台可能根本不会面临这个问题。

我们如何知道DLL文件里面有什么?

你必须使用像DUMPBIN或Dependency Walker这样的外部工具,它不仅能够显示DLL文件中包含哪些公开可见的函数(称为导出),还有哪些其他DLL文件需要以及哪些DLL文件从这个DLL文件导出依赖于。

我们如何创build/使用它们?

请参阅您的供应商的编程文档。 对于C ++,请参阅MSDN中的LoadLibrary 。

假设你正在制作一个可执行文件,它使用库中的一些函数。

如果您使用的库是静态的 ,链接器将直接从库中复制这些函数的目标代码并将其插入到可执行文件中。

现在,如果这个可执行文件运行,它就拥有了它所需要的所有东西,所以可执行文件加载器只是将它加载到内存中并运行它。

如果库是dynamic链接器将不插入目标代码,而是插入一个存根,基本上说这个函数位于这个位置的DLL

现在,如果这个可执行文件运行,那么可执行文件的一部分就会丢失(即存根),因此加载程序会通过可执行文件修复缺less的存根。 只有在所有的存根已经解决之后,这个可执行文件才能被允许运行。

要查看这个动作,请删除或重命名该DLL,并观察加载程序在尝试运行可执行文件时将如何报告缺less的DLL错误。

因此,名称为dynamic链接库 ,链接过程的一部分在运行时由可执行的装载器dynamic地完成。

最后要注意的是,如果你不链接到DLL,那么链接器不会插入存根,但是Windows仍然提供了GetProcAddress API,允许你在可执行文件启动后很长的时间内加载一个执行DLL函数的入口点。

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

有了这些信息,调用程序就可以调用DLL中的函数,即使它在编译时没有访问DLL。

介绍dynamic链接库有一些更多的信息。

DLL(dynamic链接库)和SL(共享库,在UNIX下相当于)只是可执行代码的库,可以在加载时dynamic链接到可执行文件。

静态库在编译时插入到可执行文件中,并从此处进行修复。 他们增加了可执行文件的大小,不能共享。

dynamic库有以下优点:

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

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

他们的主要缺点是优点#1 – 有DLL独立你的应用程序可能会导致你的应用程序停止工作或开始performance在一个奇怪的方式。 在Windows下,DLL的版本pipe理往往不能很好地pipe理,这导致了一个古怪的“DLL地狱”。

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

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

通过使用DLL,程序可以被模块化为单独的组件。 例如,会计程序可以由模块出售。 如果安装了该模块,则可以在运行时将每个模块加载到主程序中。 由于这些模块是分开的,程序的加载时间更快,并且只有在请求function时才加载模块。

此外,更新更容易适用于每个模块,而不影响程序的其他部分。 例如,您可能有一个工资计划,税率每年都在变化。 当这些更改与DLL隔离时,您可以应用更新,而无需再次构build或安装整个程序。

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

DLL(dynamic链接库)包含一个或多个应用程序或服务使用的资源。 它们可以包含类,图标,string,对象,接口以及开发人员需要存储的除UI以外的任何东西。

DLL是一个文件扩展名为“dynamic链接库”文件格式,用于保存Windows程序的多个代码和过程。 软件和游戏运行在DLL文件的基础上; DLL文件被创build,以便多个应用程序可以同时使用他们的信息。

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