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