7

我在课堂上有一个dynamicCOM 对象作为私有字段。我不确定它是否被认为是托管资源(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?
}
4

2 回答 2

6

它是一个托管资源(基本上是一个运行时可调用包装器),您应该这样清理它。 MSDN 指出

每个 RCW 在其包装的 COM 对象上维护一个接口指针缓存,并在不再需要 RCW 时释放其对 COM 对象的引用。运行时在 RCW 上执行垃圾收集。

即,RCW 是一个托管资源,它封装了非托管 COM 引用。

顺便说一句,如果您在应用程序的多个位置从多个线程使用它们,释放 COM 对象可能会很危险,如Chris Brumme 的这篇博客文章中所述

如果您以范围内的单线程方式使用 COM 对象,那么您可以在完成后安全地调用该对象上的 ReleaseComObject:希望这是您的情况。

于 2012-09-18T07:53:13.290 回答
0

1 COM 是一个组件,所以这一切都取决于他做什么。如果它满足以下功能

  • 打开文件

  • 打开网络连接

  • 非托管内存

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

=> 所以是的,它是非托管资源

垃圾收集器没有关于这个资源的信息,所以清理是给用户的

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

于 2012-09-18T07:48:26.317 回答