关于c#:加载许多托管DLL而不使用其中任何类型是否不好?

关于c#:加载许多托管DLL而不使用其中任何类型是否不好?

Is it bad to load many managed DLL's without using any types in them?

背景:在我公司,我们正在开发使用相同核心dll的大量应用程序。 这些dll使用Spring.net的IoC容器进行连线(自动连线)。 所有应用程序都使用相同的spring配置文件,并且此配置文件指向许多不同dll中的许多类。 但并非所有应用程序都需要每个dll的功能。 但是由于IoC容器的工作方式,所有dll都将加载到Spring.net中,以检查类型并检查它们实现的接口等等。

核心问题:我知道最好只是加载您真正使用的dll。 但是,仅加载托管dll对内存使用真的有害吗? 还是首先使用您在dll中使用类,并且它们得到JIT'ed,即使用了最多的内存?


如果没有使用过该程序集中的任何代码,则最终该程序集中的页面将从内存中移到页面文件中,以便使用活动中的页面。在这种情况下,总体的长期影响可能很小。虽然,这会对启动时间产生负面影响。


真的不好是很难量化的术语,我想这取决于事物的规模,总的来说,我想说的是,如果您可以避免加载不需要的东西,那么应该这样做。但是,当然,如果您要使用反射来确定是否可以使用它,则首先必须加载它……鸡肉和鸡蛋问题。

不过,需要注意的是,一旦将程序集加载到应用程序域中,便无法从该应用程序域中卸载它,但是可以动态创建应用程序域,将程序集加载到其中,并在您卸载时将整个应用程序域卸载。完成。


我不认为这很糟糕。唯一的问题是,由于元数据量大和内存量大,您的应用程序占用的应用程序某些部分更有可能位于不同的内存页面上,这可能会"导致某些性能泄漏,但是应用程序的细分范围却很小这类事情很关键。


当然,由于从磁盘读取程序集和证据/安全性检查,使用它们加载dll的w / o会导致启动时间变慢。但是,如果您是内存方面的问题,至少可以确定,如果您确实不使用任何类型的内存,那么您所浪费的内存不会超过程序集的大小。当然,如果在spring配置中指定了这些类型,则至少将这些类型加载到内存中,并将执行其静态初始化程序(如果有)。在极少数情况下,这可能是个问题。 JIT是由CLR按方法完成的,因此,不使用的方法不会浪费cpu +内存。

无论如何,您都可以将配置文件拆分为多个分区,例如通过将模块A的所有对象定义放入文件moduleA.config中,将模块B的所有定义放入文件moduleB.config中,并仅为您的特定应用程序指定真正需要的那些模块。

hth,
埃里希

附注:我还建议您将Spring for .NET相关问题发布到我们的社区论坛-更有可能在此处回答您的问题。


推荐阅读