我很想知道使用Assembly.Load(AssemblyName)
多次调用相同版本的程序集的缺点是什么。运行时是否知道在第一次调用后不再加载程序集?如果不是,是否有任何方法可以检测已加载的内容?
提前感谢。
我很想知道使用Assembly.Load(AssemblyName)
多次调用相同版本的程序集的缺点是什么。运行时是否知道在第一次调用后不再加载程序集?如果不是,是否有任何方法可以检测已加载的内容?
提前感谢。
使用此重载时,程序集仅加载一次,可以使用Process Explorer进行验证。查看已加载的模块列表,每个程序集都会通过LoadLibrary加载到.NET 3.5为止,此外还会作为内存映射文件加载到进程中。
从.NET 4.0开始,除非是预编译的ngenned程序集,否则程序集只作为内存映射文件加载,不再使用LoadLibrary。
.NET 4中的这个破坏性变更是因为微软在开发VS 2010期间发现他们的内存很快就被消耗了。有人发现,每个加载的程序集在虚拟内存中占用原始大小的两倍,因为它被LoadLibrary加载了一次,并且第二次作为内存映射文件加载。除非您使用VMMap查看进程,否则很难发现这个问题。由于VS中的大量代码,这对于现在主要由管理的VS2010来说是一个重大问题。