2012-09-18 16 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方法(或使用集團;誰在治療結束時呼籲處置)。