【问题标题】:Unload COM dll from .Net program从 .Net 程序中卸载 COM dll
【发布时间】:2008-12-25 12:44:02
【问题描述】:

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

当执行以下步骤序列时:
1.在新的子窗口中实例化COM组件 COM 组件被实例化,被子窗体使用,使用后被设置为 NULL ,希望 COM 组件被卸载。
2. 保持子窗口打开,然后编辑资源
3. 现在,去“刷新”表单,创建一个新的 COM 实例,查看更改资源的重新选择 - 但资源没有刷新。

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

【问题讨论】:

  • 您能否更具体地说明您所说的“相当重量级的答案”是什么意思?尝试这样的事情有危险吗?

标签: .net c++ com


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    COM 对象和 DLL 是两个不同的东西,即使一个存在于另一个中。某些 hack 是可能的,但更好的解决方案是以更明智的方式重写这部分,而不依赖于 DLL 卸载。

    【讨论】:

      【解决方案3】:

      discussion on clrInterop page 非常接近您在问题中概述的内容。 垃圾收集器不会卸载本机 dll。我引用:“ clr 这样做可能非常危险,因为可能存在依赖于该 dll 的其他代码(甚至是本机代码)。如果您确实确保不再使用 dll,则调用像 FreeLibrary 这样的 Windows API 可能卸载 dll 的最简单方法。”

      因此,您需要互操作 FreeLibrary 并使用它来卸载本机 dll。 虽然我可能会补充:如果您可以尝试找到不需要卸载 dll 的解决方案,请不要这样做。

      【讨论】:

        猜你喜欢
        • 2015-04-07
        • 1970-01-01
        • 2012-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-27
        • 1970-01-01
        相关资源
        最近更新 更多