.Net com服务器捕获未处理的异常

时间:2011-04-15 08:30:50

标签: c# .net com

我在C#中创建了一个Com服务器。项目类型是类库。 有没有办法在我的代码中获取未处理异常的en事件?我试过没有运气的AppDomain.CurrentDomain.UnhandledException

2 个答案:

答案 0 :(得分:4)

不可能。 CLR中的COM互操作支持代码实现了COM中的限制,即不允许异常从COM方法中转义。将使用CLR中的catch-all异常处理程序调用您的方法,该异常处理程序捕获您抛出的任何异常。它被转换为COM错误代码,HRESULT,任何COM Automation兼容接口方法的返回值。 Exception.HResult的值。 COM客户端代码使用该值来确定方法调用是否失败。

您可以使用调试器并使其在任何异常时停止。 Debug + Exceptions,勾选Thrown复选框。调试器会自动中断“第一次机会”异常。

答案 1 :(得分:3)

因为这不可能像Hans Passant的回答中所描述的那样,并且因为当Exception转换为COM HRESULT时,有用的信息(例如Stack Trace)会丢失,所以我经常使用显式接口实现来确保在我的时候记录异常从COM客户端调用ComVisible库。有点工作,但COM接口往往是稳定的,所以只做一次。

E.g:

[ComVisible(true)]
public interface IMyClass
{
    void MyMethod();
    ...
}

[
ComVisible(true),
ClassInterface(ClassInterfaceType.None)
]
public MyClass : IMyClass
{
    ...

    public MyMethod()
    {
        ... implementation 
    }

    void IMyClass.MyMethod()
    {
        try
        {
            this.MyMethod();
        }
        catch(Exception ex)
        {
            _logger.Log(ex);
            throw;
        }

    }
}