2012-09-18 15 views
7

我有一个dynamic COM对象作为我的班级中的私人领域。我不确定它是否被认为是托管资源(GC可以清理它),或者不是。动态COM对象是否被视为受管资源?

private dynamic _comConnector = null; 

...

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

在实施IDispose,我应该清理作为一个管理资源(仅当Dispose()方法被显式调用),或作为本地资源(时的Dispose(假)从终结者也被调用)?

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

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

    // Free unmanaged resources // 

    // --> Or maybe here? 
} 
+0

是,GC清除它。它没有实现IDisposable,所以没有什么可处置的。 –

+0

谷歌搜索后得到'是Activator.CreateInstance托管或非托管'...我正在寻找因为处置。 –

回答

6

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

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

I.e. RCW是包装非托管COM引用的托管资源。

顺便说一句,释放COM对象可能是危险的,如果你使用的是他们在应用程序中的多个地方多个线程,如this blog post from Chris Brumme描述。

如果您正在使用的COM对象的范围的,单线程的方式,那么你可以安全地调用ReleaseComObject的那个对象上,当你用它做:希望这是你的情况。

0

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

  • 打开文件

  • 打开的网络连接

  • 不受管理的存储器

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

=>所以,是它的非托管的ressource

垃圾收集器没有这个的ressource信息,所以清洁是用户

2对于干净的,你可以只使用Dispose方法(或使用集团;谁在治疗结束时呼吁处置)。