Есть ли определенная константа для REGDB_E_CLASSNOTREG
, которую я могу просто использовать в коде?
Снаркий ответ:
Да, это выглядит так:
public const int REGDB_E_CLASSNOTREG = unchecked((int)0x80040154);
Реальный ответ:
Нет, в .NET Framework нет ничего общедоступного, определяющего это значение для вас. Тот факт, что COMException
создается в первую очередь, указывает на то, что конкретный код ошибки (фактически значение HRESULT
, возвращаемое базовыми функциями COM) не является тем, который .NET Framework распознает и автоматически сопоставляет с более конкретный и информативный тип исключения. Как указывает документация , COMException
на самом деле является универсальным исключением, которое включает в себя свойство ErrorCode
, специально предназначенное для того, чтобы вы могли проверить HRESULT
, возвращаемый вызываемым объектом, и определить основную причину родового исключение.
Эти HRESULT
значения фактически определены в заголовочных файлах Windows, включенных в Windows SDK. Вы должны #include
эти заголовки при написании приложения Windows на C или C ++, но в управляемом мире .NET вы должны определить их самостоятельно, скопировав соответствующие определения в ваш исходный файл.
Хорошей новостью является то, что крайне маловероятно, что это значение когда-либо изменится, по крайней мере, в Windows, учитывая, насколько важна обратная совместимость и сколько приложений сломается. Такие значения можно разумно считать постоянными. Я все еще не стал бы жестко кодировать их как «магическое число» на всякий случай. Определив общедоступную константу (как я делал выше), если она изменилась , вам нужно будет только изменить код в одном месте, а затем перекомпилировать.
Что касается Моно, если им понадобится это значение, они в конечном итоге сделают то же самое, что я описал выше. Где-то в одном из их исходных файлов для их версии среды выполнения есть куча объявлений вроде internal const int ...
.