【发布时间】:2015-05-03 10:35:00
【问题描述】:
我有一个 .NET 程序集,它通过来自 Delphi 主机的 COM 互操作调用。 我知道 .NET 代码中任何未处理的异常都将由 .net com 互操作框架处理,并且相应的 HRESULT 将返回给 COM 主机 (delphi)。但是,在此异常到 HRESULT 转换期间,堆栈信息会丢失。
问题是我们想在 .net 代码中记录所有未处理的异常,但我没有找到任何方法来注册一个在发生此类异常时实际调用的 catch-all 处理程序。
我试过了:
- AppDomain.CurrentDomain.UnhandledException
- Dispatcher.CurrentDispatcher.UnhandledException
但在 COM Interop 下运行时不会调用这些。
是否可以为 COM 互操作框架的未处理异常定义某种处理程序/回调?或者以某种方式挂钩将托管异常转换为 HRESULT 以便记录异常的过程?
谢谢!
【问题讨论】:
-
我认为最好的办法是在暴露给 COM 的 C# 方法中的任何地方都使用
try { .. } catch (Exception ex) { /* save ex*/; throw; }之类的东西。或者,您可以处理AppDomain.CurrentDomain.FirstChanceException并存储最后一次机会异常,您也可以将其公开给 COM。 -
@Noseratio 您的建议有效。我没有找到更好的方法。您应该将其添加为答案,以便我接受。
-
@Noseratio 不幸的是,您提出的更好的方法不适用于我的情况。然而,这是由于 Delphi 中的一个缺陷造成的。请参阅 cmets 您的答案。我最终定义了 FirstChanceExceptions 的处理程序并存储了最后一个。