为什么要创建DLL而不是将所有内容编译为一个大的可执行文件?

问题描述:

我看到并做了很多小型产品,其中一个软件被分成一个可执行文件和多个DLL,而这些DLL不仅仅是由其他人完成的共享库,而是专门为此完成的库软件,由同一个开发团队完成。 (我不是在这里谈论的大规模产品,只需要数百个DLL并与其他产品广泛共享)。为什么要创建DLL而不是将所有内容编译为一个大的可执行文件?

我知道把代码分成几个部分,每个部分编译成一个单独的DLL,很好从开发者的角度来看。这意味着:

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

但是最终用户呢?提供一个包含一个EXE &几个DLL的软件,当所有东西都可以组合在一起时,这不是一件坏事吗?毕竟:

  • 用户可能根本不知道那些是什么文件,为什么他们填写存储在自己的硬盘,
  • 用户可能要移动一个程序,例如保存它的USB闪存驱动器上。拥有一个大的可执行文件会让事情变得更简单,大多数反病毒软件都会检查每个DLL。检查一个可执行文件比小型可执行文件和数十个库要快得多。
  • 使用DLL会使某些事情变得更慢(例如,在.NET Framework中,必须找到并检查它是否已签名),
  • 如果DLL被删除或被坏版本替换,会发生什么情况?每个程序都处理这个吗?或者甚至没有解释它有什么问题就崩溃了?
  • 有一个大的可执行文件有some other advantages

所以是不是更好但从最终用户的角度,对小/中等规模的方案,以提供一个大的可执行文件?如果是这样,为什么没有工具可以轻松完成它(例如集成在常见IDE中的魔术工具,它将整个解决方案编译成一个可执行文件,当然不是每次都按需或在部署过程中)。


这对用户来说有点类似于putting all CSS or all JavaScript files into one big file。拥有多个文件对开发人员来说更加智能并且更易于维护,但将网站的每个页面链接到两个文件而不是几十个文件可以优化性能。同样,CSS sprites对于设计师来说也很糟糕,因为他们需要更多的工作,但从用户的角度来看更好。

+0

需要CW? – 2010-06-04 09:51:28

这是一个折衷
(你想通了这一点你自己了;))
对于大多数项目,客户并不关心有多少文件被安装了,但他关心有多少功能,及时完成。让开发人员更轻松地让用户也受益。

为DLL的

一些图书馆的一些更多的理由不相同的生成发挥得很好,但可以做一个DLL的行为(例如,一个DLL可以使用WTL3,其他需要WTL8) 。

一些DLL的可以含有部件以被加载到其他可执行文件(全球钩,外壳扩展,浏览器插件)。

某些DLL可能是第三方,只能作为DLL使用。

有可能在公司内被重复使用 - 即使你只看到一个“大众”的产品,它可能会在使用DLL内部项目十几被使用。

一些DLL的可能已建有一个不同的环境,那不是可以在公司的所有开发人员。

独立的EXE与安装的产品
许多产品将不会作为独立的可执行反正工作。他们需要安装,并且用户不要碰他不应该碰的东西。拥有一个或多个二进制文件并不重要。

建造时间影响
也许你低估的生成时间的影响,并保持稳定的构建大型项目。如果一个构建需要5分钟的时间,那么你可以不加思索地称之为“让开发人员提前思考,而不是修补,直到看起来工作正常”。但这是一个严重的时间问题,而且会造成严重的分心。

单个项目的构建时间很难提高。使用VC9,在一个项目中构建并行是不稳定的,增量链接器也是如此。链接时间特别难以通过更快的机器“优化”。

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

+0

那么,我同意大部分观点。顺便说一下,我并没有打算强迫任何开发人员每次将所有内容编译成一个可执行文件(我甚至不准备自己做,因为即使在一个小项目上这样做也会很痛苦,而且只是一个糟糕的设计),而是在部署期间执行*(就像创建.msi文件很慢并且每次编译都不会执行一样)。 – 2010-06-04 11:15:17

+0

我同意你的看法,单个可执行文件有好处。 - 这样做对于部署来说听起来很诱人,但是,你的部署版本的行为与开发/调试版本不同。 (再次,开发人员的好处赢了)。 – peterchen 2010-06-04 12:06:53

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

是的,这是更好的恕我直言 - 我总是使用静态链接,正是你给的原因,只要有可能。发明动态链接的许多原因(例如节省内存)已不再适用。 OTOH,有体系结构的原因,例如插件体系结构,为什么动态链接可能优于静态。

做了很多的项目,从来没有见过它具有与居住于他的箱子一些dll文件,任何问题的最终用户。

作为开发人员,我会说是的,它可能很重要。作为最终用户谁在乎...

是的,从最终用户的角度来看,它往往会更好。但是,您提到的开发人员(以及开发流程)带来的好处往往意味着企业会选择具有成本效益的选项。

这是一个功能,也很少有用户会升值,这将花费一个不平凡的量提供。

请记住,我们在*是“高于平均水平”的用户。你有多少(非极客)家庭成员和朋友,真的价值能够将他们的软件安装到USB棒?

+0

*您有多少(非极客)家庭成员和朋友会真正重视将软件安装到USB记忆棒的能力?*:我认为情况正好相反。我记得我的妈妈从桌面删除应用程序的快捷方式,认为这样做会删除应用程序本身。非怪胎用户可能会受益于单一应用程序中的一个文件解决方案,因为它更自然。 – 2010-06-04 11:22:16

dll的巨大优势与引入边界和独立性有关。

  • 例如在C/C++中,只有导出的符号是可见的。假设一个模块A具有全局变量“scale”,而模块B具有另一个全局变量“scale”,如果你把所有的东西放在一起,在这种情况下,DLL可能会帮助你。

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