C# 释放Com对象

C# 释放Com对象,c#,com,interop,release,C#,Com,Interop,Release,哪一种方法更正确地释放com对象,类型1还是类型2,或者不重要_文档是一个接口 演员们在这里什么都不做。它仍然是同一个物体。ReleaseComObject的签名接受一个对象,因此它无论如何只会得到一个对象引用 在内部,Marshall.ReleaseComObject将减少其引用计数。如果本机对象的ref计数为零,则运行时将释放该本机对象,并且包装器将被终止。在这里,在管理方面,你没有太大的影响力。演员们在这里什么都不做。它仍然是同一个物体。ReleaseComObject的签名接受一个对象,

哪一种方法更正确地释放com对象,类型1还是类型2,或者不重要_文档是一个接口


演员们在这里什么都不做。它仍然是同一个物体。ReleaseComObject的签名接受一个对象,因此它无论如何只会得到一个对象引用


在内部,Marshall.ReleaseComObject将减少其引用计数。如果本机对象的ref计数为零,则运行时将释放该本机对象,并且包装器将被终止。在这里,在管理方面,你没有太大的影响力。

演员们在这里什么都不做。它仍然是同一个物体。ReleaseComObject的签名接受一个对象,因此它无论如何只会得到一个对象引用


在内部,Marshall.ReleaseComObject将减少其引用计数。如果本机对象的ref计数为零,则运行时将释放该本机对象,并且包装器将被终止。在管理方面,你没有多少影响力。

这里的一般答案是:两者都没有。CLR负责为您释放COM对象;如果绝对需要对释放进行显式控制,则只应使用Marshal.ReleaseComObject;以特定的顺序释放特定的对象。这些往往是一些晚期病例。大多数普通代码应该让GC完成它的工作


还要注意的是,ReleaseComObject并没有直接映射到IUnknown::Release-请查看它的工作方式和使用时间的更多详细信息。关于您希望在中使用ReleaseComObject的案例类型的更多背景信息。

这里的一般答案是:两者都不是。CLR负责为您释放COM对象;如果绝对需要对释放进行显式控制,则只应使用Marshal.ReleaseComObject;以特定的顺序释放特定的对象。这些往往是一些晚期病例。大多数普通代码应该让GC完成它的工作


还要注意的是,ReleaseComObject并没有直接映射到IUnknown::Release-请查看它的工作方式和使用时间的更多详细信息。有关您希望在处使用ReleaseComObject的情况的更多背景信息。

正确的做法是什么都不做-当对象不再可访问时,.Net framework将负责减少引用计数

事实上,不应该调用ReleaseComObject有两个原因——第一个原因是COM对象可能实际上是一个托管COM对象,在这种情况下,对ReleaseComObject的调用将失败,第二个原因是其他托管组件可能引用了它们仍在使用的_文档。在您的示例中可能不是这样,但在其他情况下很可能是这样

有关更多信息,请参阅


更新:BrendanMcKs answer有几篇有趣的文章,介绍了为什么在某些情况下,您可能需要显式调用ReleaseComObject,通常是服务器应用程序,以便出于性能原因尽快释放COM对象。

正确的做法是什么都不做,.Net framework将负责减少对象不再可访问时的引用计数

事实上,不应该调用ReleaseComObject有两个原因——第一个原因是COM对象可能实际上是一个托管COM对象,在这种情况下,对ReleaseComObject的调用将失败,第二个原因是其他托管组件可能引用了它们仍在使用的_文档。在您的示例中可能不是这样,但在其他情况下很可能是这样

有关更多信息,请参阅

更新:BrendanMcKs answer有几篇有趣的文章介绍了为什么在某些情况下您可能需要显式调用ReleaseComObject,通常是服务器应用程序为了性能原因尽快释放COM对象。

DisposeUnmanagedResources1似乎足够了。DisposeUnmanagedResources1似乎足够了那就足够了。
    private IHTMLDocument2 _document;


    public HtmlDocument()
    {
        _document = new HTMLDocumentClass();
    }

    private void DisposeUnmanagedResources1()
    {
        if (_document != null)
        {
            Marshal.ReleaseComObject(_document);
            _document = null;
        }
    }

    private void DisposeUnmanagedResources2()
    {
        if (_document != null)
        {
            var doc = ((HTMLDocumentClass) _document);

            Marshal.ReleaseComObject(doc);
            doc = null;
            _document = null;
        }
    }