我有VS2010,並添加了一個COM庫的引用到我的項目和VS嵌入項目內的主互操作。在做COM時,是否有必要在C#4中調用Marshal.ReleaseComObject?
如果我從COM庫引用對象,並且我想快速處理它們而不等待GC,是否需要調用ReleaseComObject?
我有VS2010,並添加了一個COM庫的引用到我的項目和VS嵌入項目內的主互操作。在做COM時,是否有必要在C#4中調用Marshal.ReleaseComObject?
如果我從COM庫引用對象,並且我想快速處理它們而不等待GC,是否需要調用ReleaseComObject?
Marshal.ReleaseComObject提供了一種從託管代碼中消耗的任何地方立即刪除對此COM對象的引用的方法(因爲它從持有它的RCW釋放基礎IUnknown)。
正如Hans所指出的那樣,通常正確的方法是簡單地將您的對象設爲null,以允許CLR和GC在適當的時間執行COM對象銷燬。
然而,在你需要立即採取行動(COM對象持有昂貴/稀缺資源,或者關機,其中測序是非常複雜的過程),調用ReleaseComObject的可以做正確的事情的情況。
Martyn
因此,在我的情況下,因爲我需要釋放昂貴的資源,那麼我應該真的調用ReleaseComObject,然後將.net變量設置爲null? –
是的,如果你確實需要及時發佈資源。如果這個問題表現爲性能問題,我只會這樣做。 另請:將.net變量先設置爲空。 –
嗯...如果我設置的變量設置爲null,然後我不能在ReleaseComObject的使用它了...... –
在清洗記憶方面有兩種類型的方法。
COM組件使用引用計數算法來回收內存。只要你不需要com組件的引用,你可以調用它。但通常我的方法是創建一個虛擬堆棧並刪除參考,如C#中的源代碼。 .NET保證只要RCW處於活動狀態,COM組件就存在。當RCW被垃圾收集時,釋放方法被調用。不需要在代碼中調用發佈。但它不會影響gc週期。
void DoSth { { RunTimeCallableWrapper area for the code ReleaseComObject } }
設置所有COM對象的引用爲null,並調用GC.Collect的()是更爲可靠。 –