如何从内存中释放VB6应用程序中调用的.Net DLL?

时间:2014-09-03 08:34:36

标签: .net memory-management dll vb6

我有一个旧的VB6项目,我打电话给我创建的.Net库。 我还处于这个dll的单元测试阶段,所以问题是每次我更新我的dll并使正在运行的VB6应用程序识别它时,我被迫关闭应用程序来替换旧的dll版本与新的。所以我认为dll在第一次调用时被加载到内存中,直到我退出调用它的应用程序才被释放。 反正有没有从VB6应用程序中释放DLL?

1 个答案:

答案 0 :(得分:5)

COM支持卸载不再使用的服务器。底层api调用是CoFreeUnusedLibraries()和服务器中的DllCanUnloadNow()入口点,由COM基础结构自动调用。发生这种情况的确切时刻通常是不可预测的,如果你想按需替换DLL,那么它应该已经是一个挂断。

但这对于[ComVisible] .NET程序集并不起作用。由CLR强加的限制,只有在销毁AppDomain时才能卸载.NET程序集。第一次从.NET程序集创建对象时创建。在程序退出之前,AppDomain不会被销毁,因此可以锁定DLL。

无论如何,技术上可能会发生这种情况,你必须在一个程序集中公开一个shim类,它将调用转发给另一个在另一个程序集中实现的类。您在另一个AppDomain中加载。非常痛苦,因为所需的appdomain边界封送而缓慢。一个重要的问题是,您无法获得破坏该AppDomain的良好信号。您必须使用您公开的客户端代码可以调用的方法使其显式化。进程外服务器将是另一种方法,在.NET中也是缓慢而痛苦的,它需要使用ServicedComponent类进行COM +托管。 的很多理由都需要这个。