【问题标题】:What is a dll?什么是dll?
【发布时间】:2010-10-03 19:45:13
【问题描述】:

这可能是一个非常菜鸟的问题,但在当今的网络应用程序开发世界中,许多程序员不需要处理太多的 dll,因此不必费心去了解他们的目的。

那么什么是dll?

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

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

【问题讨论】:

  • Community wiki 应该用于您的问题没有实际答案的情况。这是一个有效的问题,通过选择社区 wiki 模式,您可以防止自己和回答者在此问题中获得代表。
  • 这个问题有可能成为一个非常受欢迎的问题
  • 你觉得呢?也许是为了观点,但不太可能是为了投票……反正已经回答了 4 次了。
  • 这是微不足道的 googleable...
  • 是的,这是可以用谷歌搜索的,但我真的没有找到很多好的简洁解释,尤其是关于创建一个以及何时使用它的问题。

标签: dll


【解决方案1】:

DLL (dynamic link library) 文件可以描述为小的“子程序”,旨在帮助更大的程序运行良好。它们提供了一种将各种硬件和软件资源(在其运行时会话中的不同点)链接到它们所基于的主要可执行程序的方法,基于“按需”。这样就无需在程序首次运行时将与主可执行程序有关的所有内容加载到计算机的 RAM(随机存取存储器)中。

DLL 承载的软件资源包括用于保持程序运行并不真正需要的各种程序函数的代码:即,只需要在给定计算会话期间的特定时间调用并且实际上可能会调用的函数甚至根本不需要调用。在程序第一次运行时将这些函数(对于给定程序可能有相当多的函数)加载到计算机的 RAM 中,然后在整个会话期间将它们保留在那里将浪费 RAM 空间——这被认为是溢价。

重大进步:

DLL 的开发是计算领域的一项重大进步,因为在它们可用之前,与程序有关的所有内容(包括很少使用的函数)都必须在程序第一次加载时加载到 RAM 中。这导致计算效率极低,各种程序表现出较慢的速度。即使是运行几个简单的程序也很难进行多任务处理,因为随之而来的 RAM 压力很大。

注意事项:

DLL 通常是特定于版本的。那些适用于版本 1 的程序(或编程语言,可能是这种情况)可能不适用于版本 2。一般规则是旧版本中的 DLL 往往无法工作与较新版本兼容,但较新版本的通常可以与较旧版本的程序或编程语言很好地兼容。

【讨论】:

    【解决方案2】:

    DLL = 动态链接库

    这个名字实际上很能描述他们的成就。

    图书馆

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

    链接

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

    动态

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

    【讨论】:

      【解决方案3】:

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

      创建一个类似于创建一个EXE,除了不需要main() 函数。有链接器指令告诉链接器创建一个 DLL 而不是 EXE。

      您想要这样做的主要原因是将一些代码封装在一个地方并从多个 exe 中使用它,而不是将代码链接到每个 exe 中。

      有些历史原因是您的 exe 可以更小,因为某些代码实际上位于不同的文件中。这意味着您的 exe 在内存中占用的空间量可以更小。在现代系统上,这个问题比以前少了,但在 Windows Mobile 上仍然可能是个问题。

      【讨论】:

        【解决方案4】:

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

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

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

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

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

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

        【讨论】:

        • 感谢您的回答,我想知道的一件事是应用程序如何知道 dll 中可用的功能? dll本身就是机器码吧?那么dll中的公共函数签名是如何暴露的呢?
        • 我不懂大多数语言,但 Visual Studio 的自动完成功能会显示所有可用的功能。
        • 但是如果 dll 只是机器码,自动完成功能如何找出可用的功能呢?
        • 机器可以读取机器码。 DLL 可以包含图标、字符串、字体。大概有一个列表,其中包含其中某处的内容。
        • Visual C++ 包含一个名为 dumpbin 的工具——运行“dumpbin /exports whatever.dll”会告诉您导出了哪些函数和内容(即可供加载 DLL 的程序使用)。
        【解决方案5】:

        动态链接库。

        举个例子,如果你有其他人的 DLL 加载到你的应用程序中,你可以使用它的一些编程。

        您可以加载一个 DLL,该 DLL 生成总是以“5”或其他东西开头的随机数。

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

        对于一个真实世界的例子,我有一个 DLL,它结合了 4 个文本框(您可以使用这些文本框输入 IP 地址),它自动只接受小于 256 的数字,并处理按退格键跳转到上一个文本框。

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

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

        【讨论】:

          【解决方案6】:

          来自MSDN Library

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

          【讨论】:

            猜你喜欢
            • 2011-07-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多