2012-04-16 66 views
1

我在做單元測試。「已經與其基礎RCW分離的COM對象無法使用」?

我在我的解決方案中有2個項目1是庫項目,1是測試項目。 庫項目有一些com組件。而測試項目正在測試圖書館項目中的功能。而這些庫函數正在使用這些com對象。

第一個單元測試執行成功,但當我嘗試執行2個單元測試,然後在第二個單元測試中,我收到錯誤「COM對象已經從其基礎RCW分離不能使用」,當我嘗試訪問這些COM對象。

回答

1

這意味着某人正在錯誤地使用Marshal.ReleaseComObject,或者更糟的是,使用Marshal.FinalReleaseComObject。第一個單元測試通過這種相關的副作用影響第二個,也許是以拆卸方法。解決這個問題的第一步是準確找出哪個對象/訪問/位置造成該異常。

發生這種情況的原因是,對於COM對象已經釋放的RCW(COM ref-count設置爲0)調用了一個方法,這意味着ReleaseComObject被調用次數過多或者FinalReleaseComObject已被調用。

如果自己一個RCW對象(有「將其納入CLR」),它的壽命到了,ReleaseComObject是好的(設置變量null以及避免再次使用它)。使用FinalReleaseComObject通常是永遠不會有問題因爲不可能正確跟蹤它的生命週期。訣竅是記住單個RCW對象代表代表一個或多個次,COM對象已被「引入CLR」並具有內部(非COM)計數器。

很多情況下當GC運行終結器時,GC將正確處理RCW清理。並且當時RCW不可達到,因此不能生成。在需要COM壽命的嚴格控制(考慮COM對象的「共享」Dispose)時,[僅]需要/有用明確的ReleaseComObject。與外接開發Microsoft Office產品:)時,這出現一個好一點的

有在.NET and COM Interoperability : release COM from .NET client額外的細節(我回答)和反文章ReleaseComObject considered dangerous

編碼愉快。

+0

你能告訴我如何明確ReleaseComObject。我應該在哪裏調用dispose。我不知道關於Idisposable接口。 – 2012-04-16 09:21:14

+0

你*不*調用'Dispose'。 'ReleaseComObject'只能在需要時使用。我只是解釋導致這個例外的原因。我的鏈接響應有關於RCW如何工作以及何時應該使用「ReleaseComObject」以及它具有哪些副作用和問題的更多細節。同樣,當代碼錯誤地使用'ReleaseComObject'或'FinalReleaseComObject'時,這個異常會導致:即使底層COM對象被釋放(ref-count爲0),一個RCW對象(這是一個.NET對象)仍然在浮動*。 。 – 2012-04-16 22:02:21

相關問題