11

我看到并自己做了很多产品,其中同一个软件被分成一个可执行文件和几个 DLL,这些 DLL 不仅仅是由其他人完成的共享库,而是专门为这个软件完成的库,由同一个开发团队。(我在这里不是在谈论只需要数百个 DLL 并与其他产品广泛共享的大型产品。)

我知道从开发人员的角度来看,将代码分成几个部分,每个部分都编译成一个单独的 DLL,这很好。代表着:

  • 如果开发人员更改了一个项目,他只需要重新编译这个项目和依赖的项目,这会更快。
  • 一个项目可以由团队中的单个开发人员完成,而其他开发人员将只使用提供的接口,而无需进入代码。
  • 软件的自动更新有时可能更快,对服务器的影响更小。

但是最终用户呢?当所有东西都可以组合在一起时,交付一个由一个 EXE 和几个 DLL 组成的软件不是很糟糕吗?毕竟:

  • 用户甚至可能不明白这些文件是什么以及为什么它们会在他的硬盘上填满内存,
  • 用户可能想要移动程序,例如将其保存在 USB 闪存驱动器上。拥有一个大的可执行文件让事情变得更容易,
  • 大多数防病毒软件都会检查每个 DLL。检查一个可执行文件将比较小的可执行文件和几十个库快得多。
  • 使用 DLL 会使一些事情变慢(例如,在 .NET Framework 中,必须找到一个“好”的库并检查它是否已签名),
  • 如果 DLL 被删除或替换为错误版本会怎样?每个程序都处理这个吗?或者它甚至没有解释它有什么问题就崩溃了?
  • 拥有一个大的可执行文件还有其他一些优势

那么从最终用户的角度来看,对于中小型程序来说,交付一个大的可执行文件不是更好吗?如果是这样,为什么没有工具可以轻松做到这一点(例如,集成在通用 IDE 中的魔术工具将整个解决方案编译成一个可执行文件,当然不是每次,而是按需或在部署期间)。


这在某种程度上类似于将所有 CSS 或所有 JavaScript 文件放入一个大文件中供用户使用。拥有多个文件对开发人员来说更智能并且更易于维护,但是将网站的每个页面链接到两个文件而不是几十个文件可以优化性能。同样,CSS sprite对设计师来说很糟糕,因为它们需要更多的工作,但从用户的角度来看却更好。

4

6 回答 6

9

这是一个权衡
(你自己已经想通了;))
对于大多数项目,客户并不关心安装了多少文件,但他关心及时完成了多少功能。让开发人员的生活更轻松也使用户受益。

DLL 的更多原因

有些库在同一个构建中不能很好地协同工作,但可以在 DLL 中运行(例如,一个 DLL 可能使用 WTL3,另一个需要 WTL8)。

某些 DLL 可能包含要加载到其他可执行文件(全局挂钩、shell 扩展、浏览器插件)中的组件。

某些 DLL 可能是第 3 方的,仅作为 DLL 提供。

公司内部可能会重复使用——即使您只看到一个“公共”产品,它也可能在使用该 DLL 的十几个内部项目中使用。

某些 DLL 可能是使用不同的环境构建的,该环境并非对公司中的所有开发人员都可用。

独立的 EXE 与已安装的产品
许多产品无论如何都不能作为独立的可执行文件工作。它们需要安装,并且用户不要触摸他不应该触摸的东西。拥有一个或多个二进制文件并不重要。

构建时间影响
也许您低估了构建时间的影响,并为大型项目保持稳定的构建。如果构建甚至需要 5 分钟,您可以委婉地称之为“让开发人员提前思考,而不是修补直到看起来可以正常工作”。但这是一个严重的时间进食者,并造成严重的分心。

单个项目的构建时间很难改善。在 VC9 上工作,在一个项目中构建并行化是不稳定的,增量链接器也是如此。更快的机器特别难以“优化”链接时间。

开发人员独立性
您可能低估的另一件事。
要使用 DLL,您需要一个 .dll 和一个 .h。要编译和链接源代码,通常需要设置包含目录、输出目录、安装第三方库等,真的很痛苦。

于 2010-06-04T10:59:32.993 回答
1

是的,恕我直言更好——而且我总是出于您给出的原因,尽可能使用静态链接。发明动态链接的许多原因(例如节省内存)不再适用。OTOH,有架构原因,例如插件架构,为什么动态链接可能比静态链接更可取。

于 2010-06-04T09:54:23.743 回答
0

我认为您关于仔细考虑可交付成果的最终包装的一般观点是很好的。在 JavaScript 的情况下,这种打包确实是可能的,并且压缩产生了显着的差异。

于 2010-06-04T09:54:19.347 回答
0

做过很多项目,从来没有遇到过一个终端用户对他的盒子上的一些 dll 文件有任何问题。

作为开发人员,我会说是的,这可能很重要。作为关心的最终用户...

于 2010-06-04T09:58:05.000 回答
0

是的,从最终用户的角度来看,它通常可能会更好。但是,您提到的对开发人员(和开发过程)的好处通常意味着企业会更喜欢具有成本效益的选项。

这是一个很少有用户会喜欢的功能,而且交付成本不菲。

请记住,我们在 StackOverflow 上是“高于平均水平”的用户。您有多少(非极客)家庭成员和朋友会真正重视将他们的软件安装到 USB 记忆棒的能力?

于 2010-06-04T10:13:35.353 回答
-1

dll 的最大优势在于引入边界和独立性。

  • 例如,在 C/C++ 中,只有导出的符号是可见的。想象一个带有全局变量“scale”的模块A和带有另一个全局变量“scale”的模块B,如果你把它们放在一起,你就会陷入灾难;在这种情况下,一个 dll 可能会对您有所帮助。

  • 您可以将这些 dll 作为组件分发给没有完全相同的编译器/链接器选项的客户;这通常是进行跨语言互操作的好方法。

于 2012-02-13T11:04:04.597 回答