什么是dll?


90

这可能是一个非常棘手的问题,但是在当今的Web应用程序开发世界中,许多程序员不需要过多地处理dll,因此不必理会它们的用途。

那么什么是dll?

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

有人告诉我dll用于存储函数库,但是除此之外,我所知不多。希望这里有人能启发我,让我终于可以不再怀疑Windows目录中的所有.dll文件在做什么。


如果您的问题没有实际答案,则应使用社区Wiki。这是一个有效的问题,通过选择社区Wiki模式,您可以防止自己和应答者获得该问题的代表。
2009年

这个问题有可能会成为一个非常受欢迎的问题
Tamas Czinege 09年

1
您认为?也许是要发表意见,但不太可能要投票……无论如何,它已经被回答了4次。
奥马尔·库赫吉

2
这是微不足道的谷歌...
annakata

3
是的,这是可谷歌搜索的,但是我还没有真正找到很多关于它的简洁明了的解释,特别是在创建一个以及何时使用它的问题上。
丹尼尔(Daniel)2009年

Answers:


55

DLL是动态链接库。它是代码和/或数据的集合,可以由多个应用程序(或其他库/模块)使用。

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

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

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

但是,静态链接并不总是一种选择。例如,您不能静态链接.NET应用程序。用户必须具有.NET库才能运行.NET应用程序,并且库(或在.NET中称为程序集的程序集)将在运行时加载。

DLL由用于创建应用程序的相同工具创建。具体细节在很大程度上取决于所使用的工具。


感谢您的回答,我想知道的一件事是应用程序如何知道dll中可用的功能?dll本身就是所有机器代码吗?那么dll中的公共功能签名如何公开?
丹尼尔(Daniel)2009年

我不了解大多数语言,但是Visual Studio的自动完成功能将为您显示所有可用功能。
Grant

1
但是,如果dll只是机器代码,则自动完成功能如何找出可用的功能?
丹尼尔(Daniel)2009年

2
机器可以读取机器代码。DLL可以包含图标,字符串,字体。大概那里有什么清单。
格兰特

1
Visual C ++包含一个名为dumpbin的工具-运行“ dumpbin / exports what.dll”将告诉您导出了哪些函数和内容(即,可供加载DLL的程序使用)。
Graeme Perrow,2009年

29

DLL =动态链接库

这个名字实际上是对他们成就的描述。

图书馆

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

链接

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

动态

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


10

DLL(动态链接库)文件可以描述为小型“子程序”,意在帮助较大的程序正常运行。它们提供了一种将各种硬件和软件资源(在其运行时会话中的各个点)链接到它们所基于的主要可执行程序的方法,并且它们是“按需分配”的。这样就无需在首次运行该程序时将与主要可执行程序有关的所有事情加载到计算机的RAM(随机存取存储器)上。

DLL承载的软件资源包括各种代码功能的代码,这些代码实际上并不需要使程序保持运行:也就是说,仅需要在给定的计算会话期间的特定时间调用这些函数,而实际上甚至不需要被称为。当程序第一次运行时,将那些功能(对于给定的程序,可能有很多功能)加载到计算机的RAM上,然后在整个会话期间将其保留在计算机的RAM上,这将浪费RAM空间-被认为是在溢价。

主要进步:

DLL的开发是计算领域的重大进步,因为在首次使用程序时,与程序相关的所有内容(包括很少使用的功能)都必须先加载到RAM上,然后才能使用。这导致计算效率极低,各种程序的速度降低。由于运行在RAM上的压力很大,通过运行几个简单的程序来执行多任务也非常困难。

注意事项:

DLL通常是特定于版本的。例如,对于程序的版本1(或视情况而定的一种编程语言)而言,效果较好的版本可能不适用于版本2。通常的规则是,旧版本中的DLL往往无法正常工作。较新的版本很好用,但是较新版本的程序通常可以与较旧版本的程序或编程语言一起很好地工作。


7

动态链接库。

举一个例子,如果您将别人的DLL加载到您的应用程序中,则可以使用其中的一些编程。

您可以加载生成随机数的DLL,该随机数始终以“ 5”开头。

在您的程序中,您可以调用CrazyDLL.GenerateRandomNumbersSorta(),它将返回该数字。

对于一个真实的例子,我有一个DLL,它结合了4个文本框(您将使用它们来键入IP地址),并且它仅自动接受小于256的数字,并处理按退格键以跳到上一个文本框。

我已经用该代码创建了一个DLL,现在要做的就是拖放更多这些IP地址文本框集合,而不必一遍又一遍地重复所有这些代码。

相同的DLL还具有将IP地址转换为十六进制字符串以及其他有用代码的功能。



1

DLL =动态 加载链接库。如您所知,它基本上是函数,C ++类和/或全局变量的集合。您可以静态地加载DLL(即,操作系统在程序启动时自动加载DLL),也可以动态地加载(您的程序明确地加载它),此时DLL中的函数和内容对程序可用。

创建一个类似于创建一个EXE,除了不需要一个 main()功能。有链接程序指令可以告诉链接程序创建DLL而不是EXE。

您要执行此操作的主要原因是将一些代码封装在一个地方,并从多个exe使用它,而不是将代码链接到每个exe。

出于某种历史原因,您的exe可能会更小,因为某些代码实际上位于其他文件中。这意味着您的exe占用的内存空间可能较小。在现代系统上,这不是以前的问题,尽管在Windows Mobile上可能仍然是问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.