Deployment 一个大的可执行文件或许多小的DLL';s

Deployment 一个大的可执行文件或许多小的DLL';s,deployment,dll,executable,Deployment,Dll,Executable,这些年来,我的应用程序从1MB增长到了25MB,我希望它能进一步增长到4050MB。我不使用DLL的,但把一切都放在这个大的可执行文件 拥有一个大的可执行文件具有某些优势: 在客户处安装我的应用程序实际上是:复制并运行 升级可以轻松压缩并发送给客户 没有冲突DLL的风险(客户没有EXE的X版本,但是DLL的Y版本) 大EXE的最大缺点是链接时间似乎呈指数增长 另外一个问题是,代码的一部分(比如说40%)与另一个应用程序共享。同样,优势在于: 不存在混合使用错误DLL版本的风险 每个开发人员

这些年来,我的应用程序从1MB增长到了25MB,我希望它能进一步增长到4050MB。我不使用DLL的,但把一切都放在这个大的可执行文件

拥有一个大的可执行文件具有某些优势:

  • 在客户处安装我的应用程序实际上是:复制并运行
  • 升级可以轻松压缩并发送给客户
  • 没有冲突DLL的风险(客户没有EXE的X版本,但是DLL的Y版本)

大EXE的最大缺点是链接时间似乎呈指数增长

另外一个问题是,代码的一部分(比如说40%)与另一个应用程序共享。同样,优势在于:

  • 不存在混合使用错误DLL版本的风险
  • 每个开发人员都可以对通用代码进行更改,从而加快开发速度
但是,这同样会严重影响编译时间(每个人都会在电脑上再次编译公共代码)和链接时间

这个问题提到了在一个可执行文件中混合DLL的可能性,但看起来这仍然需要您在应用程序中手动链接所有函数(使用LoadLibrary、GetProcAddress等)


您对可执行文件的大小、DLL的使用以及轻松部署和轻松/快速开发之间的最佳“平衡”有何看法?

一个大的可执行文件绝对是有益的-您可以进行整个程序优化,减少开销,维护也简单得多


至于链接时间,您可以同时拥有“多个DLL”和“一个大的可执行文件”。对于每个DLL,都有一个构建静态库的项目配置。因此,当您调试东西时,您编译项目的“DLL”配置,当您需要发布时,您编译项目的“静态库”配置。有时,在不同的配置中,您会有不同的行为,但每个事件都必须解决这个问题。

单个可执行文件对可维护性有巨大的积极影响。在现场调试、部署(大小问题除外)和诊断更容易。正如你所指出的,它完全避开了地狱


解决问题最简单的方法是使用两种编译模式,一种是为生产构建单个exe,另一种是为开发构建大量小型DLL。

维护大型程序的更简单方法是将它们组合成更小的可管理部分。一个程序可以组成一个shell和为shell添加功能的模块。Visual Studio、outlook等大型程序都使用相同的概念。尝试这种方法来创建一个更易于维护和更健壮的程序。

其宗旨是:将.NET程序集的数量减少到最低限度。只有一个组件是理想的数目。例如,反射器或NHibernate都是极少数组件。我的公司在这个主题上发布了一个大的可执行文件或许多小的DLL:

  • (8页)
  • (7页)
这些白皮书中开发的参数附带了创建程序集的无效/有效理由以及关于工具代码库的案例研究


问题在于MS培养(并且仍在培养)程序集是组件的想法,而程序集只是打包代码的物理工件。组件的概念是一个逻辑工件,通常一个组件应该包含几个组件。使用名称空间的概念对组件进行分区是一个好主意,尽管这并不总是可行的(特别是在使用公共API的框架中,其中名称空间用于对API进行分区,而不一定是组件)

考虑到“一个大的EXE”模型列出的缺点都是针对开发人员的,不是用户,这个想法很有道理。事实上,我现在就是这么做的,但我问这个问题的原因是,我觉得每个人都在使用大量的DLL,但显然,这里给出的所有答案似乎也更喜欢单一EXE解决方案。直到现在,我还是以单一EXE构建我的应用程序。现在我在一个所有东西都是DLL的环境中工作。我们的办公室里乱七八糟!交付和调试是一场噩梦。@Rigel我不知道你有多大的影响力来影响事情,但减轻痛苦的一种方法是将每个程序所需的所有DLL打包到它自己的私有目录中,确保它不会与任何其他程序共享它们。重要的不是避免DLL,而是避免共享。“大EXE的缺点是链接时间似乎呈指数增长”-也许是时候改变编程语言了?:)