我们有一个 .Net 应用程序,从中实例化 C++ COM 组件。我们从子窗体窗口加载 COM 组件。.Net 应用程序正在编辑一个公共资源,而 COM dll 则使用该资源来启动。

当执行以下步骤序列时:
1.在新的子窗口中的实例化com组件com组件已实例化,并由子形式使用,在使用后,将其设置为无效,希望COM组件能卸载。
2.保持子窗口打开,然后编辑资源
3.现在,去“刷新”表单,创建一个新的 COM 实例,以查看更改后的资源的反映 - 但资源并未刷新。

我们还使用了 Marshal.ReleaseComObject 方法,但没有成功。请指教。

没有正确的解决方案

其他提示

一旦 DLL 被加载到 .Net AppDomain 中,就不可能强制卸载 DLL。这是 CLR 的一个不幸的限制。如果您确实需要卸载 DLL,可以执行以下操作。

  1. 创建一个新的应用程序域
  2. 将 DLL 加载到新的 DLL 中
  3. 在新的 AppDomain 中完成工作
  4. 卸载新的AppDomain

如果某个 DLL 仅在一个 AppDomain 中加载,则卸载该 AppDomain 也会卸载该 DLL。所以这将卸载 DLL。然而,这是一个相当重量级的答案。

COM对象和DLL是两个不同的事情,即使一个驻留在另一个。某些黑客是可能的,但更好的解决方案是在其中不依赖于DLL卸载更明智的方式改写该部分。

一个上clrInterop页面讨论描述非常接近你在你的问题概括。 垃圾收集器不卸载机DLL。我引述:“这可能是非常危险的CLR要做到这一点,因为可能有其他代码(甚至是本地代码),这取决于DLL如果你这样做确保DLL是不再使用,调用一个Windows API像FreeLibrary则可能是卸载DLL最简单的方法。“

所以,你需要互操作FreeLibrary则并用它来卸载机DLL。 虽然我想补充:不,如果你可以尝试找到一个解决方案,你不需要卸载DLL

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top