我在做單元測試。「已經與其基礎RCW分離的COM對象無法使用」?
我在我的解決方案中有2個項目1是庫項目,1是測試項目。 庫項目有一些com組件。而測試項目正在測試圖書館項目中的功能。而這些庫函數正在使用這些com對象。
第一個單元測試執行成功,但當我嘗試執行2個單元測試,然後在第二個單元測試中,我收到錯誤「COM對象已經從其基礎RCW分離不能使用」,當我嘗試訪問這些COM對象。
我在做單元測試。「已經與其基礎RCW分離的COM對象無法使用」?
我在我的解決方案中有2個項目1是庫項目,1是測試項目。 庫項目有一些com組件。而測試項目正在測試圖書館項目中的功能。而這些庫函數正在使用這些com對象。
第一個單元測試執行成功,但當我嘗試執行2個單元測試,然後在第二個單元測試中,我收到錯誤「COM對象已經從其基礎RCW分離不能使用」,當我嘗試訪問這些COM對象。
這意味着某人正在錯誤地使用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
編碼愉快。
你能告訴我如何明確ReleaseComObject。我應該在哪裏調用dispose。我不知道關於Idisposable接口。 – 2012-04-16 09:21:14
你*不*調用'Dispose'。 'ReleaseComObject'只能在需要時使用。我只是解釋導致這個例外的原因。我的鏈接響應有關於RCW如何工作以及何時應該使用「ReleaseComObject」以及它具有哪些副作用和問題的更多細節。同樣,當代碼錯誤地使用'ReleaseComObject'或'FinalReleaseComObject'時,這個異常會導致:即使底層COM對象被釋放(ref-count爲0),一個RCW對象(這是一個.NET對象)仍然在浮動*。 。 – 2012-04-16 22:02:21