簡體   English   中英

調用COM-dll組件后,調試器不會捕獲C#異常

[英]After calling a COM-dll component, C# exceptions are not caught by the debugger

我正在使用由第三方軟件公司提供的COM dll(我沒有源代碼)。 我確實知道他們使用Java來實現它,因為它們的對象包含諸如“ JvmVersion”之類的屬性名稱。

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

為了顯示:

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

VS將捕獲異常1,並顯示“黃色異常窗口”。

異常2將打開一個標題為“ Visual Studio即時調試器”的對話框,其中包含文本“ myfile.vshost.exe [1348]中發生未處理的win32異常”。 然后是我系統上現有VS實例的列表以供選擇。

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

好吧,那不是很好。 但是,您尚未證明CLR的異常處理邏輯是完全令人厭煩的。 您描述的內容也可以通過使調試器脫離來解釋。 Java JVM肯定是候選對象。 檢查是否仍然可以嘗試,如果仍然可以使用此COM服務器,則可以嘗試。

但是調試會很痛苦。 幸運的是,分離僅發生一次。 首次調用服務器后,嘗試編寫System.Diagnostics.Debugger.Break(),在出現的對話框中單擊“調試”。

還測試空引用異常是否仍然有效,這是硬件異常,VM可以通過調用Windows的SetUnhandledExceptionFilter()來重定向該異常。 如果無法捕獲到該錯誤,則您不應按原樣使用此COM服務器,否則將嚴重破壞您的進程。 在一個單獨的過程中運行它,並與WCF或Remoting進行交談是一個絕望的舉動,可以解決。

不用說,該組件供應商嚴重違反了COM服務器合同。 您不必忍受它。

在main()(在Program.cs文件中)中添加以下行(作為第一行)使異常再次起作用:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

上面的代碼行覆蓋了自動處理程序,該處理程序在我使用COM組件后由於某種原因而停止工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM