2010-05-09 43 views
1

我正在使用由第三方軟件公司(我沒有源代碼)提供給我的COM DLL。我確實知道他們使用Java來實現它,因爲它們的對象包含屬性名稱,如'JvmVersion'。調用COM-dll組件後,C#異常不會被調試器捕獲

在我實例化一個由提供的COM dll引入的對象之後,我的C#程序中的所有異常都無法被VS調試器捕獲,並且每次發生異常時,我都會得到默認的Windows調試器選擇對話框(並執行我的程序在完整的VisualStudio調試環境下以調試模式)。

舉例說明:

throw new Exception("exception 1"); 
m_moo = new moo(); // Component taken from the COM-dll 
throw new Exception("exception 2"); 

異常1將VS被捕獲並顯示 「黃色例外窗口」。

異常2將打開一個名爲「Visual Studio Just-In-Time Debugger」的對話框,其中包含文本「myfile.vshost.exe [1348]中發生未處理的win32異常」。接着是我的系統上現有的VS實例列表以供選擇。

我猜「moo」對象的實例會覆蓋C#的異常處理程序或類似的東西。我是否正確,有沒有辦法保存C#的異常處理程序?

回答

1

嗯,那不好。但是,您尚未證實CLR的異常處理邏輯完全是受限制的。你所描述的也可以通過分離調試器的東西來解釋。 Java JVM肯定會成爲候選人。檢查一個嘗試是否仍然有效,如果它仍然有機會使用此COM服務器。

但是調試會很痛苦。幸運的是,分離只發生一次。嘗試在第一次調用服務器之後編寫System.Diagnostics.Debugger.Break(),單擊對話框中的「調試」。

還要測試一個空引用異常是否仍然有效,這是一個硬件異常,很容易被調用Windows'SetUnhandledExceptionFilter()的虛擬機重定向。如果這不能被捕獲,那麼你不應該使用這個COM服務器,它會太多地破壞你的過程。在一個單獨的進程中運行它,並與WCF或Remoting交談是一個絕望的舉動,可以解決。

不用說,這個組件供應商嚴重違反了COM服務器協議。你不應該忍受它。

+0

嘗試仍然有效。 Debugger.Break()很好 - 暫停執行併爲當前執行的行着色。 NullReferenceException與其他異常一樣是fubar。 – 2010-05-09 12:12:34

+0

聽起來沒問題。測試NRE可以被try/catch抓住。 – 2010-05-09 13:02:33

0

添加以下行(作爲第一行)我的主要()(在Program.cs的文件)​​的例外重新工作:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

上面一行會取代自動處理程序(我猜),這由於某種原因在使用COM組件後停止工作。