2011-07-06 64 views

回答

3

Marshal.ReleaseComObject提供了一種從託管代碼中消耗的任何地方立即刪除對此COM對象的引用的方法(因爲它從持有它的RCW釋放基礎IUnknown)。

正如Hans所指出的那樣,通常正確的方法是簡單地將您的對象設爲null,以允許CLR和GC在適當的時間執行COM對象銷燬。

然而,在你需要立即採取行動(COM對象持有昂貴/稀缺資源,或者關機,其中測序是非常複雜的過程),調用ReleaseComObject的可以做正確的事情的情況。

Martyn

+0

因此,在我的情況下,因爲我需要釋放昂貴的資源,那麼我應該真的調用ReleaseComObject,然後將.net變量設置爲null? –

+0

是的,如果你確實需要及時發佈資源。如果這個問題表現爲性能問題,我只會這樣做。 另請:將.net變量先設置爲空。 –

+0

嗯...如果我設置的變量設置爲null,然後我不能在ReleaseComObject的使用它了...... –

0

在清洗記憶方面有兩種類型的方法。

  • 參考計數算法
  • 垃圾收集

COM組件使用引用計數算法來回收內存。只要你不需要com組件的引用,你可以調用它。但通常我的方法是創建一個虛擬堆棧並刪除參考,如C#中的源代碼。 .NET保證只要RCW處於活動狀態,COM組件就存在。當RCW被垃圾收集時,釋放方法被調用。不需要在代碼中調用發佈。但它不會影響gc週期。

void DoSth 
{ 
     { 
      RunTimeCallableWrapper area for the code 
      ReleaseComObject 
     } 
} 
相關問題