我在C#中创建了一个Com服务器。项目类型是类库。 有没有办法在我的代码中获取未处理异常的en事件?我试过没有运气的AppDomain.CurrentDomain.UnhandledException
答案 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;
}
}
}