【发布时间】:2011-05-12 16:50:33
【问题描述】:
我有一个从 Excel VBA 调用的 C# DLL,我通过 COM Callable Wrapper / COM Interop 公开了它。我希望能够将 C# 代码中发生的任何异常传递给 VBA 客户端。有没有推荐的方法来做到这一点?谢谢。
【问题讨论】:
标签: c# vba com-interop
我有一个从 Excel VBA 调用的 C# DLL,我通过 COM Callable Wrapper / COM Interop 公开了它。我希望能够将 C# 代码中发生的任何异常传递给 VBA 客户端。有没有推荐的方法来做到这一点?谢谢。
【问题讨论】:
标签: c# vba com-interop
可以创建自己的异常,将 HRESULT 错误代码传回 VBA 或其他基于 COM 的调用者。下面是一个使用 E_FAIL 的示例:
public class ComMessageException : Exception
{
public ComMessageException(string message)
:base(message)
{
HResult = unchecked((int)0x80004005);
}
}
Here is an MSDN article 描述该过程。
这应该为您提供与 VB6 中相同的 VBA 错误支持,它将向用户显示您选择的错误消息以及您选择的 HRESULT。
【讨论】:
几年前,我对返回 COM 函数调用的错误信息有模糊的记忆。 COM 函数不应返回异常。 COM 函数中发生错误的事实由返回值表示。 S_OK (0) 表示成功。负数意味着失败。您可以使用不同的负数来传递基本错误类型,但是对于更具体的错误信息,您必须在 COM 对象上实现 IErrorInfo 接口。
完成此操作后,Visual Basic 6 和 Visual Studio 2000 在 Visual Basic 中很好地处理了 COM 错误,但是旧版本的 VBA 没有。
如果有人最近使用 COM,他们很可能能够填写详细信息,并纠正我这些年来记忆模糊的地方。
让我感到震惊的是,实现将异常转换为记录的 COM 错误的新 COM 包装器代码并不是一件容易的通用事情,并且可以制作手动编码版本,但同样,您需要了解 COM 编程。
重新设计您的 .NET 对象,以便它们通过在您的对象中调用您的 getlasterror() 方法报告错误详细信息将是一个明智的解决方法。
【讨论】: