我不確定標題是否足夠,但這是我的問題:調試時消失COM對象
我有一個應用程序在.NET 4.0中使用一些COM對象寫入。當我設置一個斷點並檢查我的代碼太長時,當我嘗試執行與COM相關的一行代碼時,我得到一個異常。如果我相對快速地通過我的代碼,一切都很好。
是否有一些開關來防止這種情況發生?什麼導致了這種行爲?
我得到的消息是InvalidCastException類型。
在此先感謝
我不確定標題是否足夠,但這是我的問題:調試時消失COM對象
我有一個應用程序在.NET 4.0中使用一些COM對象寫入。當我設置一個斷點並檢查我的代碼太長時,當我嘗試執行與COM相關的一行代碼時,我得到一個異常。如果我相對快速地通過我的代碼,一切都很好。
是否有一些開關來防止這種情況發生?什麼導致了這種行爲?
我得到的消息是InvalidCastException類型。
在此先感謝
確定引用COM對象是否正確。否則,操作系統會發現COM對象不再被引用,從而將其從內存中釋放。
這是相同的代碼。差異在於我如何快速通過代碼 – kamilw 2010-09-13 10:00:17
當COM接口的IUnknown :: QueryInterface()方法返回E_NOINTERFACE錯誤返回碼時,會引發InvalidCastException。這兩個基本原因。通常的做法是,COM對象根本不會實現要投射到的接口。然而,這是非常可重複的,它不會受到調試會話的影響。
第二個原因更棘手,與線程有關。當您在另一個線程中使用RCW時,CLR將自動封送接口指針。這要求COM服務器要麼顯式地實現IMarshal接口,要麼註冊(從IDL構建的)代理/存根DLL或支持標準編組器(使用類型庫)。
這不是普遍的做法,有許多COM服務器只是假設他們只能從單個線程使用。由於它在Watch窗口中評估表達式的方式,因此調試器開始播放。它實際上運行代碼來獲取表達式的值。確切的規則沒有很好的記錄,我知道,但有時代碼將運行在輔助線程上。典型的例子是如果你使用Debug + Break All來分解程序。如果COM服務器不支持封送處理,那麼該輔助線程將會炸彈。要檢查的一件事是擁有COM對象的線程是當前線程。調試+ Windows +線程並雙擊擁有的線程(通常是您的應用的主線程)。
不是一個很好的解釋,它不是你觀察的扣籃,但我懷疑這是接近問題。您可以做的事情不多,避免使用Watch窗口顯示COM服務器屬性。或者編寫一些調試代碼將服務器屬性複製到本地變量中,然後將Watch放在該變量上。
我不必做任何事情。沒有看窗口。沒有評估。只需在斷點處斷開等一兩分鐘,然後按照COM對象命中F10即可。 – kamilw 2010-09-13 13:54:53
不知道。至少發佈一些代碼行。 – 2010-09-13 14:10:55
GC.KeepAlive是否使引用和底層COM對象保持活動狀態? – 2010-09-13 10:06:23
我還沒有嘗試過,但這意味着我必須爲我的代碼中的每個COM對象調用它。那是對的嗎? – kamilw 2010-09-13 10:17:55
嘗試在一個孤立的部分,看看它是否在該地區有任何影響。 – 2010-09-13 10:30:05