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接口來寫清理代碼,並正確調用。
雖然頗有不少迷霧,爲了幫助後人探索,記錄至此。