C# 调用COM dll组件后,调试器不会捕获C异常
我使用的是第三方软件公司提供给我的COM dll,我没有源代码。我确实知道他们使用Java来实现它,因为他们的对象包含像“JvmVersion”这样的属性名 在实例化由提供的COM dll引入的对象后,VS调试器无法捕获C程序中的所有异常,每次出现异常时,我都会获得默认的Windows调试器选择对话框,这是在完整VisualStudio调试环境下以调试模式执行程序时出现的 举例说明:C# 调用COM dll组件后,调试器不会捕获C异常,c#,visual-studio-2008,debugging,exception-handling,jvm,C#,Visual Studio 2008,Debugging,Exception Handling,Jvm,我使用的是第三方软件公司提供给我的COM dll,我没有源代码。我确实知道他们使用Java来实现它,因为他们的对象包含像“JvmVersion”这样的属性名 在实例化由提供的COM dll引入的对象后,VS调试器无法捕获C程序中的所有异常,每次出现异常时,我都会获得默认的Windows调试器选择对话框,这是在完整VisualStudio调试环境下以调试模式执行程序时出现的 举例说明: throw new Exception("exception 1"); m_moo = new moo();
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实时调试器的对话框,其中包含myfile.vshost.exe[1348]中发生未处理的win32异常的文本。然后是要从中选择的系统上现有VS实例的列表
我猜moo对象的实例化会覆盖C的异常处理程序或类似的东西。我说的对吗?有没有办法保留C的异常处理程序 那可不好。然而,您还没有证明CLR的异常处理逻辑是完全错误的。您所描述的内容也可以通过分离调试器来解释。Java JVM肯定是一个候选。检查try是否仍然有效,如果有效,您仍然有机会使用此COM服务器 然而,调试将是痛苦的。幸运的是,分离只发生一次。尝试编写System.Diagnostics.Debugger.Break在第一次调用服务器后,单击将出现的对话框上的“调试” 还要测试空引用异常是否仍然有效,这是一个硬件异常,可能会被调用Windows的SetUnhandledExceptionFilter的VM重定向。如果无法捕获,则不应按原样使用此COM服务器,它会过多地破坏进程的稳定性。在一个单独的进程中运行它,并用WCF或远程处理与它交谈,这是一个可能奏效的绝望之举
不用说,这个组件供应商严重违反了COM服务器合同。你不应该忍受它。嗯,那不好。然而,您还没有证明CLR的异常处理逻辑是完全错误的。您所描述的内容也可以通过分离调试器来解释。Java JVM肯定是一个候选。检查try是否仍然有效,如果有效,您仍然有机会使用此COM服务器 然而,调试将是痛苦的。幸运的是,分离只发生一次。尝试编写System.Diagnostics.Debugger.Break在第一次调用服务器后,单击将出现的对话框上的“调试” 还要测试空引用异常是否仍然有效,这是一个硬件异常,可能会被调用Windows的SetUnhandledExceptionFilter的VM重定向。如果无法捕获,则不应按原样使用此COM服务器,它会过多地破坏进程的稳定性。在一个单独的进程中运行它,并用WCF或远程处理与它交谈,这是一个可能奏效的绝望之举
不用说,这个组件供应商严重违反了COM服务器合同。您不必忍受它。在Program.cs文件的main中添加以下行作为第一行,使异常再次工作:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
上面这一行覆盖了自动处理程序,我想由于某种原因,它在使用COM组件后停止工作 在Program.cs文件的main中添加以下行作为第一行,使异常再次工作:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
上面这一行覆盖了自动处理程序,我想由于某种原因,它在使用COM组件后停止工作 试试看,还是有用的。Break效果很好-暂停执行并给当前执行的行上色。NullReferenceException和其他异常一样是fubar。听起来不错。测试是否可以通过try/catch捕获NRE。try仍然有效。Break效果很好-暂停执行并给当前执行的行上色。NullReferenceException和其他异常一样是fubar。听起来不错。测试是否可以使用try/catch捕获NRE。