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

时间:2012-09-18 07:43:22

标签: c# c#-4.0 com idisposable

我有一个dynamic 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?
}

2 个答案:

答案 0 :(得分:6)

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

  

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

即。 RCW是一个托管非托管COM引用的托管资源。

顺便说一句,如果您在应用程序的多个位置使用多个线程,则释放COM对象会很危险,如this blog post from Chris Brumme中所述。

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

答案 1 :(得分:0)

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

  • 打开文件

  • 打开网络连接

  • 非托管内存

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

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

垃圾收集器没有关于此ressource的信息,因此clean是针对用户的

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