我正在使用由第三方软件公司提供给我的COM dll(我没有源代码)。我确实知道他们使用Java来实现它,因为它们的对象包含属性名称,如'JvmVersion'。
在我实例化由提供的COM dll引入的对象之后,我的C#程序中的所有异常都无法被VS调试器捕获,并且每次发生异常时我都会获得默认的Windows Debugger Selection对话框(这是在执行我的程序时)完整的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#的异常处理程序?
答案 0 :(得分:1)
嗯,那不好。但是,您还没有证明CLR的异常处理逻辑是完全不可靠的。您描述的内容也可以通过分离调试器的内容来解释。 Java JVM肯定会成为候选者。检查尝试是否仍然有效,如果仍然有机会使用此COM服务器。
然而,调试会很痛苦。幸运的是,分离只发生过一次。尝试在第一次调用服务器后编写System.Diagnostics.Debugger.Break(),在对话框中单击“Debug”。
还测试一个空引用异常是否仍然有效,这是一个硬件异常,可能被调用Windows的Set'handledExceptionFilter()的VM重定向。如果无法捕获,那么您不应该按原样使用此COM服务器,它会使您的进程过于不稳定。在一个单独的过程中运行它并使用WCF或Remoting与它交谈是一个绝望的举动,可以解决。
毋庸置疑,这个组件供应商严重违反了COM服务器合同。你不应该忍受它。
答案 1 :(得分:0)
在main()(在Program.cs文件中)添加以下行(作为第一行)使异常再次起作用:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
上面的一行覆盖了自动处理程序,我猜想由于某些原因在使用COM组件后停止工作。