0

摘自 Micrsoft 的“什么是 .dll?”:

“通过使用 DLL,可以将程序模块化为单独的组件。例如,会计程序可以按模块出售。如果安装了该模块,则每个模块都可以在运行时加载到主程序中。因为模块是独立的,程序的加载时间更快,并且仅在请求该功能时才加载模块。此外,更新更容易应用于每个模块而不会影响程序的其他部分。例如,您可能有一个工资单程序,并且税率每年都在变化。当这些变化被隔离到一个 DLL 时,您可以应用更新,而无需再次构建或安装整个程序。

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

DLL 是: 在运行时加载可以“动态加载”(同时由多个程序) - 这可以节省资源 - 降低磁盘空间要求

但是他们为什么要提倡“模块化”程序呢?
如果没有 .dll 文件会怎样?
有人可以提供/扩展示例吗

4

4 回答 4

1

模块化程序提供了一种使许多程序都可以使用特定功能的方法,而不必在所有程序中都包含相同的代码。此外,它们允许程序之间更大的兼容性,因为它们本质上将在通用 DLL 中使用相同的方法来获得相同的结果。

有人会以模块化的方式编写程序,以便程序的不同部分可以单独维护。假设您有一些巧妙的方法可以将自己的数据格式读取和写入文件。假设您对该技术进行了改进。如果用于读取和写入文件的代码位于 DLL 中,您只需更新 DLL。程序本身将保持不变。

于 2013-08-30T03:38:20.117 回答
1

如果你有一个单一的 EXE,你必须

  • 支付重新链接它的所有额外时间,即使 1 个源文件已更改(如果它 > 80 MB,这会很痛苦,就像大型项目中的情况一样),
  • 发送整个 EXE,而您只能发送一个大小只有一小部分的 DLL(用于补丁/更新)。

把它分解成你的 DLL

  • 具有可插入性:EXE 是主机应用程序,其他人可以编写通过明确定义的接口“插入”主机的 DLL。只要符合接口,DLL 就可以互换。
  • 可以在其他 DLL 和 EXE 之间共享代码。
  • 可以选择按需加载某些 DLL,仅在它们被使用时加载,并在不需要时卸载它们
  • 与上面类似,具有可选功能。使用单个 EXE,您必须下载所有内容,即使某些组件很少使用。使用 DLL,您可以拥有一个根据需要下载和安装功能的系统。
于 2013-08-30T04:57:28.697 回答
0

dll的最大优势可能是在原始程序的开发过程中。如果没有 dll,您将无法在不包含原始源代码的情况下与现有库集成。通过将现有库作为 dll 包含在内,您不需要源代码,因为它全部封装在 dll 中。在没有 dll 的 .Net 等框架中进行开发将是一场噩梦,因为您不断地包含其他库......

于 2013-08-30T03:37:47.630 回答
0

将程序分解n > 1成碎片的另一种方法是将其保持在n == 1碎片中。为什么这很糟糕?好吧,它并不总是很糟糕(也许 BIOS 就是一个很好的例子?)。但是对于用户程序来说通常是这样。为什么?首先我们需要定义什么是程序。

什么是程序?

一个简单的“程序”,粗略地说,由入口点(即主函数的偏移量)、函数和全局变量组成。函数由有关运行该函数所需的局部变量的指令和信息组成。要执行的程序必须加载到主存储器/RAM 中(上述信息)。因为我们的程序有函数(而不仅仅是跳转语句),这意味着堆栈的存在,这意味着存在管理堆栈的包含环境。(我想你可以有一个管理自己的堆栈的程序,但我认为你的程序不再是一个程序,而是一个环境。)这个环境包含程序,从入口点开始并执行每条指令,无论是“转到 RAM 的这一部分并将其添加到此寄存器中的任何内容中” 或“如果此寄存器全为 0,则向前跳转这么多指令并在那里继续执行”,或直到程序将控制权交还给其环境。(这有点简化了——多进程环境中的上下文切换、非法内存访问、非法指令等也可能导致控制从程序中被夺走。)

无论如何,我们有两个选择:一次加载整个程序,或者将其存储并分段加载。

n == 1

一次完成所有操作有一些好处:

  • 一旦程序在内存中,就不需要进一步执行磁盘访问(除非程序明确要求这样做)。

  • 由于程序在执行开始之前被编译/链接,您可以在没有任何类型的字符串名称/比较的情况下完成所有操作 - 直接转到地址(或偏移量)。

  • 功能永远不会彼此不同步。

n > 1

但是,有一些缺点反映了优点:

  • 大多数程序大部分时间不会执行所有代码路径。我认为有一些研究表明,在大多数程序中,大部分执行时间都花在了程序中存在的一小部分指令上。换句话说,大约 20% 的程序在 80% 的时间内被执行(我刚刚提出了这个特定的数字——但你明白了)。如果我们将程序划分得足够多,并且只加载需要的指令集(即函数),那么我们就不会浪费时间加载 80% 我们永远不会使用程序的执行。沿着这些思路,如果我们最终只加载我们需要的程序的一部分,我们最终可以一次在我们的 RAM 中容纳更多并发执行的程序。

  • 大多数程序共享相似的功能(即存储数据/树/哈希/排序/等,读取输入,写入输出等),如果每个程序都有自己的本地副本,那么您就不能重用指令代码。

  • 许多程序依赖于其他程序的存在,并由不同的公司/团体/个人维护。通过发布版本化模块,我们不必一直同步发布。

结论

这些不是唯一要考虑的问题,而是我想到的第一个问题。我建议阅读有关编译器、链接器和操作系统的信息。这将比我更彻底地回答这个问题,而且我确信这已经提出了其他问题。回顾一下 dll 并不是在所有情况和情况下打包可执行程序的“最佳”方式——它们有特定的用途和优点和缺点。

于 2013-08-30T04:09:58.513 回答