【问题标题】:Best way to clean up a COM object in a .net application在 .net 应用程序中清理 COM 对象的最佳方法
【发布时间】:2010-09-06 19:00:16
【问题描述】:

我正在开发一个内部使用 COM dll 的 .Net Windows 应用程序。 在以下 4 种释放 COM 对象的方式中,哪种方式最好?

1.
 if (obj != null)
                {
                    Marshal.ReleaseComObject(obj);
                }

2.
 if (obj != null)
                {
                    Marshal.ReleaseComObject(obj);
                    obj=null;
                }


3.if (obj != null)
                {
                    Marshal.FinalReleaseComObject(obj);
                }


4.if (obj != null)
                {
                    Marshal.FinalReleaseComObject(obj);
                    obj=null;
                }

感谢阅读。

【问题讨论】:

    标签: com interop


    【解决方案1】:

    要么按照 Richard 的建议让 GC 处理它,要么让 GC 处理它,或者您的 2 号。如果您调用 FinalReleaseComObject,您将破坏运行时可调用包装器,无论它是否也找到了进入代码其他部分的方式。这可能会严重混淆代码的其他部分。因此,每次从 COM 过渡到 .NET-land-from-COM 转换时,您应该只调用一次 ReleaseComObject

    【讨论】:

    • 感谢 Richard 和 bdonlan 的反馈。是的,这段代码不会被多次调用,所以我可以将它设置为 null。我会 ReleaseComObject[#2 option]
    【解决方案2】:

    5。让 GC 来做吧。

    这很好,除非 COM 组件占用了您需要的大量资源。


    如果您的方法基于检查obj != null,那么将obj 设置为null 是个好主意,除非您确定不会多次调用此代码。

    最佳方式:需要更多有关应用程序实施的详细信息,以便在使用 ReleaseComObjectFinalReleaseComObject 之间给出具体建议,但理想的答案是两者都不 em>。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      • 2011-01-21
      • 2010-09-10
      • 2011-03-05
      相关资源
      最近更新 更多