[英]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.