Определена константа для проверки ErrorCode для REGDB_E_CLASSNOTREG - PullRequest
0 голосов
/ 10 февраля 2012

Я видел этот ответ на похожий вопрос , но меня всегда пугает жесткое кодирование этих типов значений (особенно потому, что я хочу, чтобы мое приложение работало в Windows и Mono).Есть ли определенная константа для REGDB_E_CLASSNOTREG, которую я могу просто использовать в коде?

1 Ответ

3 голосов
/ 10 февраля 2012

Есть ли определенная константа для 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 ....

...