Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用COM dll组件后,调试器不会捕获C异常_C#_Visual Studio 2008_Debugging_Exception Handling_Jvm - Fatal编程技术网

C# 调用COM dll组件后,调试器不会捕获C异常

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();

我使用的是第三方软件公司提供给我的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");
异常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。