我看到并自己做了很多小产品,其中同一个软件被分成一个可执行文件和几个 DLL,这些 DLL 不仅仅是由其他人完成的共享库,而是专门为这个软件完成的库,由同一个开发团队。(我在这里不是在谈论只需要数百个 DLL 并与其他产品广泛共享的大型产品。)
我知道从开发人员的角度来看,将代码分成几个部分,每个部分都编译成一个单独的 DLL,这很好。代表着:
- 如果开发人员更改了一个项目,他只需要重新编译这个项目和依赖的项目,这会更快。
- 一个项目可以由团队中的单个开发人员完成,而其他开发人员将只使用提供的接口,而无需进入代码。
- 软件的自动更新有时可能更快,对服务器的影响更小。
但是最终用户呢?当所有东西都可以组合在一起时,交付一个由一个 EXE 和几个 DLL 组成的软件不是很糟糕吗?毕竟:
- 用户甚至可能不明白这些文件是什么以及为什么它们会在他的硬盘上填满内存,
- 用户可能想要移动程序,例如将其保存在 USB 闪存驱动器上。拥有一个大的可执行文件让事情变得更容易,
- 大多数防病毒软件都会检查每个 DLL。检查一个可执行文件将比较小的可执行文件和几十个库快得多。
- 使用 DLL 会使一些事情变慢(例如,在 .NET Framework 中,必须找到一个“好”的库并检查它是否已签名),
- 如果 DLL 被删除或替换为错误版本会怎样?每个程序都处理这个吗?或者它甚至没有解释它有什么问题就崩溃了?
- 拥有一个大的可执行文件还有其他一些优势。
那么从最终用户的角度来看,对于中小型程序来说,交付一个大的可执行文件不是更好吗?如果是这样,为什么没有工具可以轻松做到这一点(例如,集成在通用 IDE 中的魔术工具将整个解决方案编译成一个可执行文件,当然不是每次,而是按需或在部署期间)。
这在某种程度上类似于将所有 CSS 或所有 JavaScript 文件放入一个大文件中供用户使用。拥有多个文件对开发人员来说更智能并且更易于维护,但是将网站的每个页面链接到两个文件而不是几十个文件可以优化性能。同样,CSS sprite对设计师来说很糟糕,因为它们需要更多的工作,但从用户的角度来看却更好。