Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 具有许多DLL的应用程序是一件坏事吗?_.net_Asp.net - Fatal编程技术网

.net 具有许多DLL的应用程序是一件坏事吗?

.net 具有许多DLL的应用程序是一件坏事吗?,.net,asp.net,.net,Asp.net,我们有一个enterpise web应用程序,它由4个编译组件(DLL)组成。一年多前,我们开始实施更细粒度的组件,试图隔离功能,减少耦合,降低重新编译和部署大量代码块的风险。虽然没有人认为这种方法在添加新功能和修补bug时为我们提供了更大的灵活性和上市速度,但应用程序现在由近40个DLL组成。我们有一个命名约定,可以很好地识别组件 我的问题是:拥有一个包含许多DLL的应用程序是否存在任何不利因素(性能、维护等? 编辑:我们正在探索将代码重构为更大组件的选项,我认为这可能是某种回归…维护-否,性

我们有一个enterpise web应用程序,它由4个编译组件(DLL)组成。一年多前,我们开始实施更细粒度的组件,试图隔离功能,减少耦合,降低重新编译和部署大量代码块的风险。虽然没有人认为这种方法在添加新功能和修补bug时为我们提供了更大的灵活性和上市速度,但应用程序现在由近40个DLL组成。我们有一个命名约定,可以很好地识别组件

我的问题是:拥有一个包含许多DLL的应用程序是否存在任何不利因素(性能、维护等?


编辑:我们正在探索将代码重构为更大组件的选项,我认为这可能是某种回归…

维护-否,性能-是。需要加载的程序集越多,应用程序启动越慢。对于需要加载到AppDomain中的每个程序集,加载程序需要执行一系列验证。

DLL越多,问题越严重,包括:

  • 构建时间:编译器为每个DLL运行一次,DLL必须复制到输出目录中或从中复制
  • 加载时间:尽管DLL是按需加载的,但Windows必须单独加载每个DLL文件,因此通常只会为您使用的部件产生成本
  • 重定基址:您拥有的DLL越多,两者在虚拟内存中发生冲突的可能性就越大。这不会造成问题,因为Windows可以重新设置其中一个DLL页面的基础,但重新设置基础的过程需要时间,Windows必须提前从磁盘加载任何受影响的DLL页面。重定基址通常不会对托管DLL产生太大影响
  • Visual Studio开销:一个DLL=一个项目=IDE的更多工作
我遵循的建议是使用DLL组织部署,使用名称空间组织代码。如果您发现总是一起发布一组给定的DLL,那么不妨将它们合并

我的问题是:有什么问题吗 下侧(性能、维护、, 等)来申请 很多DLL

很多DLL的缺点是什么?否
DLL过多的缺点是什么?当然

那么多少是太多了

程序集是一种组织方式,就像名称空间和类一样。名称空间定义逻辑边界、程序集和物理边界

您应该尝试保持程序集的一致性,并将它们视为系统模块


是的,如果你有数百个这样的系统,就会有一个(小的)性能问题。但是对于40,我看不出有什么问题。

将独立的功能域分离为单个DLL通常是一件好事。它有助于引入重用的可能性,并有助于减少类的内部实现之间引入不适当的耦合

但是,将多个程序集作为系统的一部分也有缺点:

  • 加载、验证和JIT多个程序集需要更长的时间。然而,这很少是一个问题,通常不应该是您决定如何划分应用程序功能的主要问题
  • 通过在单个程序集中部署更改来更新应用程序可能是不明智的。通常将应用程序划分为单独的DLL会给人一种印象,即只需更换部分程序集就可以修复或增强应用程序。当然,如果这些程序集中的类和方法的副作用或未记录的行为发生变化,它可能会引入一些微妙的错误
  • 很难理解被划分为太多程序集的系统。诸如ReSharper和CodeRush之类的工具在分析跨多个程序集划分的代码时有一些限制
  • 它可以鼓励开发人员公开更多的类型。因为只有公共类型可以被其他程序集使用和继承,所以多程序集项目可能会产生更多的公共类型 别忘了。如果您希望多个DLL用于开发(不同的项目),而一个EXE用于部署(加载速度更快,部署更容易),那么它可以很好地工作


    ILMerge的缺点是,它在某些动态加载场景中会失败,例如,通过(字符串)名称创建类型的实例。因此,ILMerge可能可行,也可能不可行,这取决于您的IoC提供商。

    初始用户将体验到性能提升,但后续用户将不会有相同的体验…正确吗?也可以(取决于您的应用程序体系结构)“根据需要”动态加载这些程序集(即,当功能被访问时,如果有的话!)以允许应用程序最初更快地加载,并给用户更快的整体感知性能提升。@CraigTP没错,我们现在得到了这种“效果”,因为我们通常为“螺栓连接”的“一次性”功能开发组件在核心应用程序的其余部分。用户很少使用这些功能的是“随需应变”本质上是加载。您可以通过禁用项目的“复制本地”功能来缩短构建时间。这可以大大缩短构建时间。Pattrick Smacchia在一篇文章中解释了如何做到这一点:。我现在遵循的大多数程序集/命名空间技术都是从Patrick学到的。应该注意的是,您可以通过使用g InternalsVisibleTo程序集级别属性的优点。应该能够相互引用的程序集,但这些程序集之外的东西不应该,您可以使用internal和have属性使其对另一个程序集可见。@jkohlhepp:True。您也可以为这样一组程序集提供强引用名称以限制可以使用的其他程序集