动态COM对象是否被视为托管资源?

7

我在我的类中有一个动态 COM 对象作为私有字段。我不确定它是否被认为是托管资源(GC 会清理它),还是非托管资源。

private dynamic _comConnector = null;

...

_comConnector = Activator.CreateInstance(Type.GetTypeFromProgID("SomeProgId"));

在实现IDispose接口时,我应该将其清理为托管资源(仅在显式调用Dispose()时),还是作为本机资源(当从终结器中也调用Dispose(false)时)?

private void Dispose(bool disposing)
{
    if (disposing)
    {
        // Free managed resources //

        // --> Should I call Marshal.FinalReleaseComObject(_comConnector) here?
    }

    // Free unmanaged resources //

    // --> Or maybe here?
}

是的,GC会清理它。它没有实现IDisposable,因此没有需要处理的内容。 - Hans Passant
在谷歌上搜索“Activator.CreateInstance是托管的还是非托管的”后来到了这里...我是因为Dispose而寻找答案。 - Valamas
2个回答

6
这是一个受控资源(基本上是运行时可调用包装器),您应该像清理其他受控资源一样对其进行清理。根据MSDN的说法:每个RCW在它封装的COM对象上维护一个接口指针缓存,在不再需要RCW时会释放COM对象上的引用。运行时为RCW执行垃圾回收。也就是说,RCW是一个管理的资源,它封装了不受管理的COM引用。
另外,如果您在应用程序的多个线程和位置中使用COM对象,则释放COM对象可能会很危险,如Chris Brumme的这篇博客文章中所述
如果您以作用域、单线程方式使用COM对象,那么可以在完成后安全地调用ReleaseComObject该对象:希望这是您的情况。

0

1 COM 是一个组件,所以它取决于它的功能。如果它满足以下功能:

  • 打开文件

  • 打开网络连接

  • 非托管内存

  • 在 XNA 中:顶点缓冲区、索引缓冲区、纹理等。

=> 所以是非托管资源

垃圾回收器没有关于此资源的信息,因此清理由用户完成

2 对于清理,您可以使用 Dispose 方法(或使用块;在处理结束时调用 dispose)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接