2010-10-21 45 views
0

如果特定condion失敗或對象部分構建,我可以知道如何從C#.NET強制釋放COM服務器對象嗎?如何從C#.NET強制釋放COM服務器對象

問題是我使用的COM服務器使用DCOM機制;在最壞的情況下,當對象沒有完全創建,並且自從失敗後出現應用程序時,COM對象仍在內存中(顯示在COM +應用程序組件服務中)。如果超出某些限制,會導致內存泄漏和崩潰。但是,如果它的可管理的失敗數量,在某個時間點之後它會被刪除。示例: - Calculator.App objApp = new Calculator.App();

如果 {// 如何解除分配COM對象objApp }

注(obj.CanBeUsed()!): 有一個方法,所以GC.Collect()由Garbase收集用於去從堆內存強制分配。我是否可以使用這種方法或.NET franework爲這種特殊情況提供任何其他解決方案?

+0

感謝您對此的評論,Aamir。我將來會繼續努力。我沒有意識到這一點,再次感謝。 – 2010-10-21 11:49:34

回答

2

像這樣:

System.Runtime.InteropServices.Marshal.ReleaseComObject(objApp); 
+0

有一個MSDN博客說使用ReleaseComObject()是非常危險的。 http://blogs.msdn.com/b/visualstudio/archive/2010/03/01/marshal-releasecomobject-considered-dangerous.aspx。你有什麼觀點? – 2010-10-21 11:54:11

+1

你談到強制釋放對象,對吧?每當你將強有力地做一些事情,會有副作用:) – Aamir 2010-10-21 12:28:02

+0

這裏副作用不應該發生:(我將用於避免內存泄漏只,以幫助.NET框架:)。 – 2010-10-21 13:17:31

1

你應該嘗試Marshal.FinalReleaseComObject方法。

FinalReleaseComObject方法 釋放管理參考到一個 COM對象。調用此方法爲 相當於在循環 中調用 ReleaseComObject方法,直到它返回0(零)。

當COM 對象上的引用計數變爲0時,COM對象被 通常釋放,儘管這取決於 上的COM對象的實現和 超出了運行時的控制。 但是,RCW仍然存在, 等待垃圾收集。

COM對象在其 已從其基礎 RCW中分離後無法使用。如果您嘗試調用 上的方法,則其引用計數爲 後的RCW將變爲0,則會拋出InvalidComObjectException 。

+0

這有點危險。從MSDN:「通過將其引用計數設置爲0,釋放對運行時可調用包裝程序(RCW)的所有引用。」這意味着它會嘗試強制將引用計數設置爲0,這可能很糟糕,因爲可能還有其他有效的引用。 – Aamir 2010-10-21 11:41:30

+0

@Aamir:我認爲強制釋放是重點。 – 2010-10-21 11:43:55

+0

有一個MSDN博客說使用ReleaseComObject()是非常危險的。 http://blogs.msdn.com/b/visualstudio/archive/2010/03/01/marshal-releasecomobject-considered-dangerous.aspx。 – 2010-10-21 11:53:46