重复调用Assembly.Load(AssemblyName)有什么缺点?

4

我很想知道使用Assembly.Load(AssemblyName)多次调用相同版本的程序集的缺点是什么。运行时是否知道在第一次调用后不再加载程序集?如果不是,是否有任何方法可以检测已加载的内容?

提前感谢。


可能是重复的问题: https://dev59.com/W0nSa4cB1Zd3GeqPQsKq - Akhil
这句话“请注意,此方法重载始终会创建一个新的程序集对象及其自己的映射”在MSDN文档中并未包含此重载函数。这就是为什么我很好奇它们是否有不同行为的原因。 - weilin8
1个回答

10

使用此重载时,程序集仅加载一次,可以使用Process Explorer进行验证。查看已加载的模块列表,每个程序集都会通过LoadLibrary加载到.NET 3.5为止,此外还会作为内存映射文件加载到进程中。

从.NET 4.0开始,除非是预编译的ngenned程序集,否则程序集只作为内存映射文件加载,不再使用LoadLibrary。

.NET 4中的这个破坏性变更是因为微软在开发VS 2010期间发现他们的内存很快就被消耗了。有人发现,每个加载的程序集在虚拟内存中占用原始大小的两倍,因为它被LoadLibrary加载了一次,并且第二次作为内存映射文件加载。除非您使用VMMap查看进程,否则很难发现这个问题。由于VS中的大量代码,这对于现在主要由管理的VS2010来说是一个重大问题。


这比我预期的更详细。谢谢。 - weilin8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接