.NET COM Interop - >全局异常处理程序

时间:2015-03-02 22:22:39

标签: .net delphi com

我有一个.NET程序集,它是通过Delphi Host中的COM Interop调用的。 据我所知,.NET代码中任何未处理的异常都将由.net com interop框架处理,并且相应的HRESULT将返回给COM主机(delphi)。但是,在此异常到HRESULT转换期间,堆栈信息会丢失。

问题是我们想要在.net代码中记录所有未处理的异常,并且我没有找到任何方法来注册在发生此类异常时实际调用的catch-all处理程序。

我试过了:

  • AppDomain.CurrentDomain.UnhandledException
  • Dispatcher.CurrentDispatcher.UnhandledException

但在COM Interop下运行时不会调用这些。

是否可以为COM Interop Framework的未处理异常定义某种处理程序/回调?或者以某种方式挂钩将Managed Exception转换为HRESULT的过程,以便记录异常?

谢谢!

1 个答案:

答案 0 :(得分:1)

我认为这里最好的选择是使用像

这样的东西
void ComClassMethod()
{
    try { ... } 
    catch (Exception ex) 
    { 
        /* store the ex in the object */; 
        throw; 
    } 
}

您的C#方法中的任何地方都暴露给COM。

或者,您可以处理AppDomain.CurrentDomain.FirstChanceException并存储最后一次机会异常,您也可以将其暴露给COM。

但是,如果您的COM对象支持muliti-hreading(请注意,大多数.NET COM objects are free-threaded),请特别注意。在这种情况下,您需要在线程及其相应的最新异常之间维护一个映射,可以是每个对象,也可以通过System.Threading.ThreadLocal<T>全局维护(更好地决定适合您的日志记录要求)。


已更新,我一直在想,必须有更好的方法来实现这一目标。事实上,在Adam Nathan的优秀&#34; .NET和COM:完整的互操作性指南&#34;中有一个explained here。书。我不确定我是否可以复制/粘贴受版权保护材料的确切报价,但其想法如下:

  • 所有.NET CCW对象都实现ISupportErrorInfo
  • 可以通过IErrorInfo API在COM端检索扩展错误信息 - 通过GetErrorInfo对象。
  • 根据Adam Nathan的说法,此对象是.NET异常对象本身,它实现了_Exception COM接口。
  • COM客户端可以使用_Exception获取所有详细信息,包括_Exception.StackTrace

这似乎正是您正在寻找的。