C# .NET应用程序的程序集数是否达到最大值?

C# .NET应用程序的程序集数是否达到最大值?,c#,.net,winforms,architecture,plugins,C#,.net,Winforms,Architecture,Plugins,相当多的应用程序支持插件 拥有大量插件有什么坏处吗? 是否存在一个可能会导致性能下降的最佳点 在应用程序中加载的程序集的最大数量是多少?我没有具体信息,但我确信在看到任何降级之前,您可以拥有比所需数量更多的程序集 话虽如此,它还是受到其他几个因素的影响,如组件的“质量”、系统资源等。不,不存在最佳点。更多的代码需要更多的时间来加载和JIT编译。但这种情况发生时并不一定是可预测的,而是按需发生的。最大值仅受32位机器上的可用虚拟内存空间和x64机器上的分页文件大小的限制。我不知道对程序集数量的任何

相当多的应用程序支持插件

拥有大量插件有什么坏处吗? 是否存在一个可能会导致性能下降的最佳点


在应用程序中加载的程序集的最大数量是多少?

我没有具体信息,但我确信在看到任何降级之前,您可以拥有比所需数量更多的程序集


话虽如此,它还是受到其他几个因素的影响,如组件的“质量”、系统资源等。

不,不存在最佳点。更多的代码需要更多的时间来加载和JIT编译。但这种情况发生时并不一定是可预测的,而是按需发生的。最大值仅受32位机器上的可用虚拟内存空间和x64机器上的分页文件大小的限制。

我不知道对程序集数量的任何特定限制。但是,由于许多程序集,我一直面临着性能问题,对此我可以说一点

由于CLR在加载程序集时执行的各种一致性检查(例如,强名称验证)以及所需的可能性,因此拥有大量程序集很可能会对性能产生重大影响

但是,如果应用程序不要求提前加载所有程序集,那么将它们分解为多个程序集实际上可能有助于延迟较长时间内加载程序集的成本,而不是提前加载一个大型程序集

如果加载时间出现问题,您可以做以下三件事来缩短加载时间:

  • Strong为程序集命名,并在安装时将其放入GAC中
  • 在安装时对GAC的强命名程序集运行NGEN
  • 为各种DLL指定非默认基址,以最小化重定基址
对于1和2,它们几乎是齐头并进的。由于强名称验证,除非程序集位于GAC中,否则NGEN性能增益可能无法完全实现。CLR可以跳过GAC中程序集的此验证


这里有一个很好的

一个明显的限制是内存使用。每个模块都将加载到内存中。因此,对于32位操作系统,您可以获得1.3GB,而对于64位操作系统,这一限制对于今天的应用程序来说太大了。

我曾经在一个后端框架上工作过,该框架具有超过2500个端点的程序集依赖关系树。这太恶心了,花了两个小时才建成


因此,虽然您可以加载大量的插件,但要准备好让人们指着您并扔东西。

我不认为使用启用插件会导致程序集计数问题。你可能会有一个真正杀手级的应用程序(比如Firefox)拥有这么多的插件,但如果是这样的话,一般用户不会加载所有可用的插件

装配编号问题通常是由于项目本身的颗粒化过多造成的。我见过由100个VisualStudio项目组成的单片应用程序,因为架构师说“我们需要低耦合”。试着遵守罗伊·奥舍洛夫的规则:每个组件都应该有一个物理(而非逻辑)的存在理由。逻辑问题最好通过名称空间而不是程序集来解决


希望能有所帮助。

根据本文摘录,重定基址不是问题-JIT编译的代码没有重定基址问题,因为地址是在运行时根据代码在内存中的位置生成的。此外,MSIL很少受到基址未命中的影响,因为MSIL引用是基于令牌的,而不是基于地址的。因此,当使用JIT编译器时,系统对基址冲突具有弹性。是的,但我的全部观点是使用NGEN避免JIT。NGEN代码确实受到重定基址的影响。实际上,JIT完成了重定基础所能做的所有工作,甚至更多。因此,避免JIT是快速加载大量程序集的关键。无论如何,我知道这是社区wiki,但我不认为我的回答有任何理由支持否决(不是说是你,只是说…)对不起,这是一个粗心的错误,所以没有给我一个选项来纠正它,除非你编辑答案!想在你的答案中编辑一些东西,这样我就可以纠正错误的否决票了吗?当然,与FireFox插件没有什么可比性,但我们已经有近30多个可用插件了,而且还在统计中……不是2GB而不是1.3GB吗?不是。网络应用程序与本机应用程序不同。哇,这可能是最大的应用程序之一!但这不是问题,因为我们使用了IoC/DI并减少了每个插件的核心依赖项(本例中为2个)