Обработка ошибок в C # / VBA COM Interop - PullRequest
2 голосов
/ 19 ноября 2010

У меня есть C # DLL, вызываемая из Excel VBA, которую я выставил через COM Callable Wrapper / COM Interop. Я хочу иметь возможность передавать любые исключения, которые происходят в коде C #, на клиент VBA. Есть ли рекомендуемые подходы к этому? Спасибо.

Ответы [ 2 ]

2 голосов
/ 07 января 2011

Можно создать свои собственные исключения, которые сообщают коды ошибок HRESULT обратно VBA или другим вызывающим абонентам на основе COM. Вот пример, который использует E_FAIL:

public class ComMessageException : Exception
{
    public ComMessageException(string message)
        :base(message)
    {
        HResult = unchecked((int)0x80004005);
    }
}

Вот статья MSDN , которая описывает процесс.

Это должно дать вам ту же поддержку ошибок VBA, которую вы имели в VB6, оно будет отображать пользователю сообщение об ошибке по вашему выбору вместе с выбранным вами HRESULT.

0 голосов
/ 19 ноября 2010

Несколько лет назад у меня были смутные воспоминания о возврате информации об ошибках при вызовах функций COM.COM-функции не должны возвращать исключения.Факт, что произошла ошибка в функции COM, сигнализируется возвращаемым значением.S_OK (0) означало успех.отрицательные числа означали провал.Вы можете использовать разные отрицательные числа для передачи основных типов ошибок, однако для получения более конкретной информации об ошибках вам необходимо было реализовать интерфейс IErrorInfo для объекта COM.

После этого Visual Basic 6 и Visual Studio 2000 обрабатывали COMошибки в Visual Basic, однако более ранние версии VBA этого не сделали.

Если кто-то использовал COM намного позже, он вполне может заполнить детали и исправить то, что моя память затуманилась за эти годы.

Меня поражает, что реализация нового кода-обертки COM, переводящего исключения в документированные ошибки COM, не будет простой общей вещью, и что создание версии с ручным кодированием может быть выполнено, но, опять же, вам нужно понимать COMпрограммирование.

Редизайн ваших объектов .NET, чтобы они сообщали подробности ошибок, вызывая ваш метод getlasterror () в вашем объекте, был бы разумным обходным путем.

...