У меня есть DLL C#, вызываемая из Excel VBA, которую я обнаружил через COM Callable Wrapper/COM Interop. Я хочу иметь возможность передавать любые исключения, которые встречаются в коде C#, на клиент VBA. Существуют ли какие-либо рекомендуемые подходы к этому? Благодарю.Обработка ошибок в C#/VBA COM Interop
ответ
Несколько лет назад у меня смутные воспоминания о возврате информации об ошибках на вызовы функций COM. Функции COM не должны возвращать исключения. Тот факт, что ошибка произошла в функции COM, сигнализируется возвращаемым значением. S_OK (0) означал успех. отрицательные числа означали отказ. Вы можете использовать разные отрицательные числа для передачи основных типов ошибок, однако для получения более конкретной информации об ошибках вам необходимо реализовать интерфейс IErrorInfo на COM-объекте.
После этого Visual Basic 6 и Visual Studio 2000 отлично справились с ошибками COM в Visual Basic, однако более старые версии 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);
}
}
Here is an MSDN article, который описывает процесс.
Это должно дать вам ту же поддержку ошибок VBA, что и у вас в VB6, и отобразит сообщение об ошибке по вашему выбору пользователю вместе с выбранным вами HRESULT.
- 1. Обработка ошибок .net в COM
- 2. Регистрация для COM Interop
- 3. COM Interop в .NET
- 4. appdomains in COM interop
- 5. C# COM Interop Library
- 6. COM Interop .NET STA
- 7. COM Interop от ASP.NET
- 8. VBA COM interop troubles
- 9. COM Interop без Regasm
- 10. Cross User COM Interop
- 11. Com Interop Порядок деклараций
- 12. COM interop question
- 13. Com Interop w/MSXML
- 14. C# Регистрация COM interop
- 15. Помощь с COM Interop
- 16. Избегайте ошибок с использованием Interop, если COM-компонент не установлен
- 17. C# COM INTEROP в C++
- 18. COM - .NET Interop - Winform от COM-клиента
- 19. COM Interop VB6 ActiveX EXE
- 20. COM Interop - Участник не найден
- 21. COM Interop и синхронизация потоков
- 22. COM-объект excel interop clean
- 23. Вызов потоков через COM interop
- 24. COM/Interop - поддержка нескольких версий
- 25. .NET COM Interop Method Подпись
- 26. Улучшение COM Interop Cold Start
- 27. Automated Com DLL interop version
- 28. C# + COM Interop, детерминированный релиз
- 29. Обработка/.NET interop?
- 30. COM Interop Использование общих типов