我的課程使用COM資源,並且從IDisposable繼承了它。並清理非託管資源我有Dispose()方法,我在調用Marshall.ReleaseCOMObject()方法...所以我的問題是我們是否還需要一個Destructor方法(Finalizer)?釋放COM資源?當我使用finalzier方法並調用Marshal或Dispose時,我將得到一個RCW錯誤,並且當我移除終結器方法時,我不會再遇到RCW錯誤但是如果我查看一個內存分析器,我可以看到非託管資源內存不斷增加eveery時間我打開它有這個COM資源的形式...所以看起來喜歡它沒有清理它?那麼在C#應用程序中清理COM資源的正確方法是什麼?我們是否需要.NET中的Finalizer方法?
我將用一些代碼示例更新這個問題。
謝謝。
private MyCOMobject theCOMobject = null;
static SuppressFieldCntrlr()
{
new SomeCalss();
}
private bool disposed = false;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
//nothing in here, is it just for Managed Resources?
}
Marshal.ReleaseComObject(this);
MethodFoo(false);
disposed = true;
}
}
只是想補充一句:如果你在你的類中添加了終結器,你的類將自動處理有點不同。 gc的第一個突破,你的對象不是直接收集,而是放在終結器隊列中。並在下一次運行中,將被召集和收集。但是,當然這隻會發生,如果你的對象不再被任何引用,否則你可能只是有一個普通的內存泄漏,我猜是你的問題。 – dowhilefor
@dowhilefor:intresting信息。我不知道排隊。簡單的內存泄漏聽起來很正確。你能否詳細說明如何解決並找到它?這裏是關於這個原始問題,尚未答覆:http://stackoverflow.com/questions/13609098/writing-the-correct-idisposable-implementation-for-classes-with-com-objects/13609416#13609416謝謝 – Bohn
好吧我最好的建議是:使用內存分析器來查找泄漏:)如果prefere redgates螞蟻內存分析器,但我敢肯定,有很多在那裏。一些調查建議:請記住,事件持有很強的參考。事實上,檢查你是否使用單身人士,檢查所有在某一點上持有一個參考的物體,並且比你的泄漏級別活得更長。 – dowhilefor