У меня есть базовая библиотека, созданная в VB6, которая предоставляет стандартный COM-интерфейс, который используется в ряде приложений. Это также выявило ряд констант кода ошибки, используемых с Err.Raise
для обозначения определенных условий.
Public Enum IOErrors
IOErrorBase = 45000
IOErrorConnectionFailed
IOErrorAuthFailed
IOErrorNotConnected
IOErrorInvalidPortDirection
IOErrorGettingValue
IOErrorNoValueYet
End Enum
Прошло 10 лет, и мы создаем объекты C#, реализующие один и тот же набор интерфейсов, и хотим генерировать исключения таким образом, чтобы вызывающее приложение могло их распознать.
Я могу найти только два соответствующих класса, Win32Exception
и COMException
.
Выброс Win32Exception((int)IOErrors.IOErrorConnectionFailed, "Connect failed")
передает сообщение обратно правильно, но код ошибки игнорируется, а Err.Number
равен &H80004005
.
Выброс COMException("Connect failed", IOErrors.IOErrorConnectionFailed)
приводит к тому, что вызывающее приложение не обнаруживает ошибку, предположительно потому, что код ошибки не является HRESULT
и является положительным, что означает успех.
TL; DR Как я могу создать исключение из C #, чтобы COM-взаимодействие преобразовало его в один из распознанных (положительных) кодов ошибок выше?