C#/VBA COM互操作中的错误处理

C#/VBA COM互操作中的错误处理,c#,vba,com-interop,C#,Vba,Com Interop,我有一个C#DLL被从Excel VBA调用,我通过COM可调用包装器/COM互操作公开了它。我希望能够将C#代码中出现的任何异常传递到VBA客户端。有没有什么推荐的方法可以做到这一点?谢谢。几年前,我对返回COM函数调用的错误信息记忆犹新。COM函数不应返回异常。COM函数中发生错误的事实由返回值发出信号。S_OK(0)表示成功。负数意味着失败。您可以使用不同的负数来传递基本错误类型,但是对于更具体的错误信息,您必须在COM对象上实现IErrorInfo接口 完成这项工作后,VisualBas

我有一个C#DLL被从Excel VBA调用,我通过COM可调用包装器/COM互操作公开了它。我希望能够将C#代码中出现的任何异常传递到VBA客户端。有没有什么推荐的方法可以做到这一点?谢谢。

几年前,我对返回COM函数调用的错误信息记忆犹新。COM函数不应返回异常。COM函数中发生错误的事实由返回值发出信号。S_OK(0)表示成功。负数意味着失败。您可以使用不同的负数来传递基本错误类型,但是对于更具体的错误信息,您必须在COM对象上实现IErrorInfo接口

完成这项工作后,VisualBasic6和VisualStudio2000在VisualBasic中很好地处理了COM错误,但旧版本的VBA没有这样做

如果有人最近使用过COM,他们很可能能够填写详细信息,并纠正我多年来记忆模糊的地方

让我印象深刻的是,实现一个新的COM包装器代码,将异常转换为文档化的COM错误,这不是一件容易的通用事情,而且可以制作一个手工编码的版本,但同样,您需要理解COM编程


重新设计.NET对象,以便它们通过在对象中调用getlasterror()方法来报告错误详细信息,这将是一个明智的解决办法。

可以创建自己的异常,将HRESULT错误代码传回VBA或其他基于COM的调用者。下面是一个使用E_FAIL的示例:

public class ComMessageException : Exception
{
    public ComMessageException(string message)
        :base(message)
    {
        HResult = unchecked((int)0x80004005);
    }
}
这就是过程

这将为您提供与在VB6中相同的VBA错误支持,它将向用户显示您选择的错误消息以及您选择的HRESULT