2010-11-19 7 views
2

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

ответ

0

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

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

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

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

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

2

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

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

Here is an MSDN article, который описывает процесс.

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