RCW 生存期控制

RCW是.net 對com的包裝,好比office就是經過RCW來被.net調用的。能夠百度:office pia 瞭解更多信息。函數

RCW 是一個.net類。測試

1.關閉線程對rcw的自動清理.net

System.Threading.Thread.CurrentThread.DisableComObjectEagerCleanup();線程

2.當即清理rcw對象

 System.Runtime.InteropServices.Marshal.CleanupUnusedObjectsInCurrentContext();接口

不過通過實際測試,沒發現有什麼做用,尚未摸索出應用場合。可是能夠確定的是,當即清理rcw並不會清理rcw,至少還活着(被引用)的rcw不會被清理。io

 

在析構函數執行階段:基礎

若是你代碼中用了析構函數,試圖清理rcw對象,這個作法可能不如你想象中達成。百度

rcw是一個.net 對象,全部.net 對象的析構函數的執行順序是不肯定的,也就是你想用析構函數去操控rcw,而rcw可能自身已經釋放了。這裏面的釋放並非說rcw已經死亡,而是說rcw對com的引用關係已經釋放,你再調用它包裝的com對象的任意成員,都會引起:System.Runtime.InteropServices.InvalidComObjectException,提示:COM 對象與其基礎 RCW 分開後就不能再使用。sed

究竟rcw是選擇怎樣的時機釋放com的,我不得而知,估計也是相似使用虛構函數或者被GC直接回收(但由於個人析構函數有它的引用應該不會)。有虛構函數的對象會比沒有的回收速度要慢一級。

另外,rcw並非真的正確釋放了com,com對象仍是存在的,只是rcw不能控制。

如何讓rcw正確清理,這個rcw是否提供什麼機制,這點沒搞清楚。可是客戶類只能經過顯式的dispose接口來寫清理代碼,並正確調用。

雖然頗有不少迷霧,爲了幫助後人探索,記錄至此。

相關文章
相關標籤/搜索