我们有一个.Net应用程序,从中实例化C ++ COM组件。 我们从子窗体窗口加载COM组件。有一个公共资源正由.Net应用程序编辑,COM dll正在使用它来启动。
执行以下步骤时:
1.在新子窗口中实例化COM组件
COM组件是实例化的,由子表单使用,在使用之后,它被设置为NULL,希望卸载COM组件。
2.保持子窗口打开,然后编辑资源
3.现在,去“刷新”表单,创建一个新的COM实例,以查看已更改资源的反馈 - 但资源未刷新。
我们也使用了Marshal.ReleaseComObject方法,但没有成功。 请指教。
答案 0 :(得分:4)
将DLL加载到.Net AppDomain后,无法强制卸载DLL。这是CLR的一个不幸的限制。如果您绝对需要卸载DLL,则可以执行以下操作。
如果DLL仅加载到一个AppDomain中,则卸载AppDomain也会卸载DLL。所以这将卸载DLL。然而,这是一个非常重要的答案。
答案 1 :(得分:0)
COM对象和DLL是两个不同的东西,即使一个驻留在另一个。某些黑客攻击是可能的,但更好的解决方案是以更合理的方式重写此部分,而不依赖于DLL卸载。
答案 2 :(得分:0)
discussion on clrInterop page描述了您在问题中概述的内容。 垃圾收集器不会卸载本机DLL。我引述:“clr执行此操作可能非常危险,因为可能还有其他代码(甚至本机代码)依赖于该dll。如果确实不再使用dll,则调用像FreeLibrary这样的Windows API可能是卸载dll的最简单方法。“
所以你需要互操作FreeLibrary并使用它来卸载本机dll。 虽然我可能会补充:如果您可以尝试找到不需要卸载DLL的解决方案,请不要。