代码之家  ›  专栏  ›  技术社区  ›  Nenad Dobrilovic

发布COM组件

  •  5
  • Nenad Dobrilovic  · 技术社区  · 17 年前

    我在网上找到了关于这个话题的各种相互矛盾的建议。在我看来,由于outlookpia总是返回对其接口的新引用,作为从其方法返回值,因此没有必要显式地释放它。我说得对吗?

    8 回复  |  直到 17 年前
        1
  •  2
  •   Jordan Parmer    17 年前

    我个人并没有使用过微软的办公软件,但在大多数情况下,你们不应该这样做

    编辑: 如果遇到确实需要清理COM/Interop对象的情况,请使用Marshal.finalEleaseComObject(将引用计数一直设置为零,而不是仅递减1),并将对象引用设置为null。如果需要,可以显式强制垃圾收集(GC.Collect) 真正地 我们希望安全,但要小心执行GC太频繁,因为它确实会引起明显的性能损失。

        2
  •  2
  •   Community Mohan Dere    9 年前

    通常,使用Microsoft Office时,您确实需要明确发布引用,这可以分两个阶段安全完成:

    (1) 首先通过调用GC.Collect()和GC.WaitForPendingFinalizers()释放所有未持有命名对象变量的次要对象。(如果所涉及的对象可能具有终结器,例如在使用Visual Studio Tools for Office(VSTO)时,则需要调用此函数两次。)

    (2) 然后通过调用每个对象上的Marshall.finalEleaseComObject()显式释放包含命名变量的对象。

    就这样。:-)

    我更详细地讨论了这个问题 in a previous post ,以及一个代码示例。

        4
  •  1
  •   Gulzar Nazim    17 年前

    有一些好的做法 here 使用托管包装器..值得签出。。

        5
  •  0
  •   Robert S.    17 年前

        6
  •  0
  •   Community Mohan Dere    9 年前

    如中所述,如果希望退出Office应用程序实例,则确实需要这样做 this post .

        7
  •  0
  •   Franci Penov    17 年前

    关于.Net/COM互操作有一条简单的规则-当有疑问时,请始终释放()。:-)

        8
  •  0
  •   Community Mohan Dere    9 年前

    但这会打开另一罐蠕虫,因为看起来RCW是每个进程的,因此您可以破坏一些其他加载项,这些加载项碰巧引用了同一个对象。

    here ,但我仍然没有明确的答案。一旦我知道更多,我会编辑这篇文章。