![](/img/trans.png)
[英]Using external DLL's in C# COM-DLL project for MS-Access usage
[英]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.