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

Sal*_*eem 1 .net vb6 dll memory-management

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

Han*_*ant 5

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

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

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