什么是dll?

97

这可能是一个非常初学者的问题,但在今天的Web应用程序开发世界中,许多程序员不需要太多处理DLL,因此也不会去了解它们的目的。

那么什么是DLL?

  1. 它的作用是什么?
  2. 它如何工作?
  3. 如何创建一个DLL?
  4. 在哪些情况下适合创建一个DLL?

我被告知,DLL用于存储函数库,但除此之外我并不了解更多。希望有人能在这里为我提供启示,这样我就可以终止对Windows目录中所有.dll文件做什么的困惑了。


社区维基应该用于那些没有实际答案的情况下。这是一个有效的问题,通过选择社区维基模式,你可以防止自己和回答者在这个问题上获得声望。 - Serafina Brocious
这个问题有可能成为一个非常受欢迎的问题。 - Tamas Czinege
1
你这么认为?也许对于浏览量来说是这样,但对于投票来说可能不太可能... 不管怎样,这个问题已经被回答了4次。 - Omar Kooheji
2
这是显而易见可以通过谷歌搜索得到的内容。 - annakata
3
是的,这个可以通过谷歌搜索得到答案,但我还没有找到太多简洁明了的解释,特别是关于如何创建和合适使用的问题。 - Daniel
关于将这个标记为社区 wiki 是不正确的这一点,我并不是非常熟悉此功能,但我的意图是让人们编辑我的问题,如果他们认为可以改进的话。 - Daniel
6个回答

57

DLL是动态链接库。它是一组代码和/或数据,可供多个应用程序(或其他库/模块)使用。

例如,处理文件、使用GUI组件等常见方法可在库中提供,因此多个应用程序可以使用相同的功能。这不仅减少了多次构建相同内容的需求,而且还确保了例如公共对话框在应用程序之间的一致性。

库可以在运行时加载,从而在不同的并发应用程序之间共享。这称为动态链接。

在某些情况下,库可以包含在应用程序本身中。这称为静态链接。静态链接使部署变得更加容易,但代价是灵活性不足,因为每个应用程序都将加载DLL的相同副本。

然而,静态链接并不总是可行的。例如,无法静态链接.NET应用程序。用户必须拥有.NET库才能运行.NET应用程序,并且库(或在.NET中称为程序集)是在运行时加载的。

DLL由用于创建应用程序的相同工具创建。具体细节非常依赖于所使用的工具。


谢谢您的回答,我想知道的一件事是应用程序如何知道dll中有哪些函数可用?dll本身都是机器代码,对吧?那么dll中的公共函数签名是如何暴露出来的? - Daniel
我不知道大多数编程语言,但是Visual Studio的自动完成功能会显示所有可用的函数。 - Grant
1
但是,如果dll只是机器代码,自动完成如何找出可用函数是什么? - Daniel
2
机器可以读取机器代码。DLL 可以包含图标、字符串和字体。可能在其中有一个包含它所包含的内容的列表。 - Grant
嗯,好的,我猜它的内容是在文件的头部分之类的地方定义的。这很有道理,谢谢。 - Daniel
1
Visual C++ 包含一个名为 dumpbin 的工具 -- 运行 "dumpbin /exports whatever.dll" 将告诉您导出的函数和其他内容(即可供加载 DLL 的程序使用的内容)。 - Graeme Perrow

32

DLL = 动态链接库

这个名称实际上非常描述它们所完成的内容。

让您将特定问题域的代码隔离到单个位置中。然后在多个应用程序之间共享此库。可以随时替换另一个库以修复错误或添加功能。

链接

您可以将库“链接”到应用程序中,以使库中的逻辑不直接编译到应用程序中。

动态

可以按需加载库。操作系统可以仅加载所需部分,而不是将一个庞大的单个EXE加载到内存中。而且如果DLL在应用程序之间共享,则操作系统可以优化如何加载库并在应用程序之间共享它。


10

DLL(动态链接库)文件可以描述为小的“子程序”,旨在帮助更大的程序运行良好。它们提供了一种将各种硬件和软件资源(在其运行时会话的各个点上)链接到它们所基于的主可执行程序的方式,根据需要随时处理。这消除了在首次运行程序时将与主可执行程序有关的所有内容加载到计算机的RAM(随机访问存储器)中的需求。

DLL所携带的软件资源包括那些并不真正需要保持程序运行的代码:也就是那些仅需要在给定计算会话期间某些时候调用的功能,实际上甚至可能根本不需要被调用。当第一次运行程序时将这些功能(对于一个给定的程序可能有很多)加载到计算机的RAM中,然后在会话期间保持它们存在会浪费RAM空间,而RAM空间被认为是非常宝贵的。

一个重大进步:

开发DLLs是计算领域的重大进步,因为在DLLs可用之前,与程序有关的所有东西(包括很少使用的功能)必须在程序首次加载时加载到RAM中。这导致计算非常低效,各种程序的速度变慢。同时运行甚至只有几个简单程序也非常困难,因为会给RAM带来不小的负担。

考虑因素:

DLL通常是特定于版本的。那些适用于版本1的程序(或编程语言,如果可能的话)的DLL可能与版本2不兼容。一般规则是旧版本中的DLL往往无法与新版本良好地配合使用,但新版本的程序或编程语言的DLL通常可以与旧版本良好地配合使用。


7
动态链接库。
举个例子,如果您的应用程序中加载了别人的DLL,您可以从中使用一些编程位。
您可以加载一个生成随机数的DLL,这些随机数始终以“5”开头。
在您的程序中,您可以调用CrazyDLL.GenerateRandomNumbersSorta(),它将返回该数字。
作为一个真实的例子,我有一个DLL,它结合了4个文本框(您可以使用这些文本框来输入IP地址),并自动只接受小于256的数字,并处理按退格键跳转到前一个文本框的情况。
我已经创建了一个带有该代码的DLL,现在我只需拖放更多的IP地址文本框集合,而不必反复复制所有的代码。
同样的DLL还具有将IP地址转换为十六进制字符串和其他有用代码的功能。

2
动态链接库(DLL)是一组函数、C++类和/或全局变量的集合。可以静态地加载DLL(即当程序启动时,操作系统会自动加载它),也可以动态地加载DLL(程序显式加载)。在此之后,DLL内部的函数和其他内容将对您的程序可用。
创建DLL与创建EXE类似,只是不需要一个main()函数。有链接器指令告诉链接器要创建DLL而不是EXE。
主要原因是将代码封装在一个地方并从多个exe中使用它,而不是将代码链接到每个exe中。
某种历史原因是您的exe可以更小,因为某些代码实际上位于不同的文件中。这意味着在内存中占用的空间可能更小。在现代系统上,这比以前不再是问题,但在Windows Mobile上仍可能存在问题。

1

来自MSDN Library

动态链接库(DLL)是一个模块,其中包含可以被另一个模块(应用程序或DLL)使用的函数和数据。*


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接