何时将在另一个dll中使用单例类的dll被销毁

时间:2015-03-25 19:13:47

标签: c# .net dll

如果我们在dll中创建一个单例类并在另一个实例化这个单例类的dll中使用它,并且exe在某个时间点使用这个dll,这两个dll会在他们的工作后立即卸载还是会得到它们只有当主exe退出时才会卸载?

1 个答案:

答案 0 :(得分:2)

免责声明:我不是内存或进程/应用程序域的专家,所以我可能有一些错误,但我坚信我的结论是有效的 - 随意评论并纠正任何特定错误。


不,在包含它的应用程序域(通常是Windows /控制台应用程序的主要进程和ASP.NET应用程序的网站)关闭之前,不会卸载DLL。

来自MSDN

  

如果不卸载包含它的所有应用程序域,就无法卸载单个程序集。

所以你可以手动创建(和销毁)app域,这将卸载任何DLL,但是你必须跨域边界编组数据,这可能更糟而不仅仅是将DLL保存在内存中。

DLL创建的对象可以从内存中删除(如果没有任何内容引用它们),但代码本身将保留在内存中。在纯单例的情况下,它将保留在内存中直到应用程序关闭(因为管理它的类将始终具有引用)。您可以从工厂类中删除对单例的引用,但您仍可能有其他引用它的代码,因此您可能会冒“”单个多个实例。如果这不是一个问题,那么当你完成它时,这可能是处理单身的有效策略。

考虑大多数应用程序 - 它们以某种方式响应人类交互。用户可以按应用程序允许的任何顺序单击任何按钮,选择任何菜单项等。一个应用程序如何确定知道DLL中的代码永远不会被再次调用?加载程序集的成本相对较高(部分原因是它们必须是JITted),因此如果有可能再次加载它们,则卸载它们会效率低下。

底线 - 因为DLL的内存占用量通常相对较小(因为它只包含代码和元数据),并且只为整个域加载一次,除非您遇到大量内存压力它不能通过更好地管理其他内存来重温,我不会去尝试卸载