【问题标题】:Error Handling in C# / VBA COM InteropC#/VBA COM 互操作中的错误处理
【发布时间】:2011-05-12 16:50:33
【问题描述】:

我有一个从 Excel VBA 调用的 C# DLL,我通过 COM Callable Wrapper / COM Interop 公开了它。我希望能够将 C# 代码中发生的任何异常传递给 VBA 客户端。有没有推荐的方法来做到这一点?谢谢。

【问题讨论】:

    标签: c# vba com-interop


    【解决方案1】:

    可以创建自己的异常,将 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。

    【讨论】:

      【解决方案2】:

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

      完成此操作后,Visual Basic 6 和 Visual Studio 2000 在 Visual Basic 中很好地处理了 COM 错误,但是旧版本的 VBA 没有。

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

      让我感到震惊的是,实现将异常转换为记录的 COM 错误的新 COM 包装器代码并不是一件容易的通用事情,并且可以制作手动编码版本,但同样,您需要了解 COM 编程。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-23
        • 1970-01-01
        • 1970-01-01
        • 2011-08-05
        • 2010-12-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多