假设我有两个完全独立的.NET应用程序,Foo.exe
和Boo.exe
,它们都使用位于Foo和Boo的bin文件夹中的同一个库TestLib.dll
(两份)。
.NET会加载这两个dll,浪费size_of_dll * 2
大小的RAM还是会检查强大的程序集名称,大小等......并且只加载和加载两个程序集中的一个?
答案 0 :(得分:4)
你是正确的,DLL的一个功能是使用该DLL的多个进程可以共享某些部分以减少内存使用(这是一个Windows功能,并不是特定于.Net),但我相当肯定要使其工作,两个进程必须在磁盘上加载相同的物理DLL,在这种情况下,这不会发生在您描述的场景中。
如果您安装到公共位置(例如GAC),那么Windows将能够跨多个进程共享DLL的某些部分以节省内存。对于.net程序集,您还需要NGen the assembly in order to take advantage of this
请注意,“已保存”的内存量为不 size_of_dll
,因为无法共享该DLL映像的某些部分,即可以修改的该DLL的任何部分。这些部分仍然在多个进程中重复,以确保应用程序不会意外地修改彼此的数据。
答案 1 :(得分:2)
是的,每个AppDomain都会加载一次DLL。但是,您可以跨多个AppDomain共享DLL以减少内存使用量。如此code project article中所述。
如果程序中的多个域使用了程序集,那么 程序集的代码(但不是其数据)可以由所有域共享 引用程序集。这减少了使用的内存量 运行时间。
答案 2 :(得分:2)
如果您希望多个进程共享同一个程序集,则有两个选项:
答案 3 :(得分:2)
使用两个.net 4.0项目,一个类库和Process Explorer对此进行测试 - 默认情况下,Visual Studio将引用的dll复制到项目的bin
目录。
Process Explorer为引用的dll返回两个不同的地址,而为其他特定于Windows的库返回相同的地址。
结论:是的,对于两个应用程序加载的不同文件夹中同一个库的两个副本,同一个库可能会被加载两次。
答案 4 :(得分:0)
我认为你在询问程序集的代码是每个进程加载一次还是在本机dll之类的进程之间共享。答案不是主要因为代码不是本机的,而且必须是JIT。 Jitting按程序进行。预先组装的组件(ngen)能够共享代码。