2010-03-08 34 views
3

我一直在尋找一種工具來調試未發佈的COM引用,這通常會導致如果代碼沒有正確調用所有COM實例上的Marshal.ReleaseCOMObject,Word/Outlook進程將掛起在內存中。 (Outlook 2007部分修復了Outlook加載項,但這是一個通用的問題)。如何從託管代碼調試未發佈的COM引用?

是否有一個工具可以顯示至少一個由託管代碼持有的COM引用列表(按類型)?理想情況下,它還會顯示內存分析器樣式的對象樹,以幫助調試參考增量發生的位置。

在運行時進行調試並不重要,因爲能夠附加到掛起的進程 - 因爲當代碼與COM接口完成並且有人忘記釋放某些內容時通常會發生問題 - 應用程序(例如winword)掛起內存,即使在調用託管應用程序退出之後。

如果這樣的工具不存在,什麼是(技術?)原因?在使用COM互操作時,調試大量非常難以發現的問題將非常有用。

回答

0

不太答案(或那樣簡單),你正在尋找,但ReleaseComObject的(一樣,它封裝了原生版本)返回一個整數,它應指示剩餘未完成的引用數。你可以將代碼添加到您的項目明確地做一個的AddRef,所以你可以再放開,看看新的計數,看看是否是你期待什麼,等

+0

不利於在所有的時候掛起的原因使用枚舉,或忘記了「一條龍」的屬性訪問要求每個實例被釋放,例如是例如document.Sections [0] .Ranges [0]。文本。 – Marek 2010-03-09 08:29:35

+0

我承認它並不像您要找的那樣乾淨或簡單。但是,如果你做了一個子程序AddRef和發佈,並報告返回值,並且之前和對象的所有使用後調用這個(或只是你是可疑的手段,來減少工作量),你會得到更好的發生了什麼事情的圖片。例如,如果你之前和使用之後枚舉這樣做,你可以看到,如果事情在該代碼是圍繞着離開的參考。 – 2010-03-09 17:02:04

相關問題