定义常量以检查REGC_E_CLASSNOTREG的ErrorCode

时间:2012-02-10 17:22:52

标签: c# .net-4.0 mono

我看到this answer to a similar question,但它总是让我害怕硬编码这些类型的值(特别是因为我希望我的应用程序在Windows和Mono上运行)。我可以在代码中使用REGDB_E_CLASSNOTREG定义的常量吗?

1 个答案:

答案 0 :(得分:3)

  

我可以在代码中使用REGDB_E_CLASSNOTREG定义的常量吗?

Snarky回答:

是的,它看起来像这样:

public const int REGDB_E_CLASSNOTREG = unchecked((int)0x80040154);

真实回答:

不,.NET Framework中没有任何公开内容可以为您定义该值。首先抛出COMException的事实表明特定错误代码(实际上是由基础COM函数返回的HRESULT值)不是.NET Framework识别的错误代码和自动映射到更具体和信息丰富的异常类型。正如documentation所示,COMException实际上是一个包含ErrorCode属性的通用异常,因此您可以检查被调用方返回的HRESULT并确定基础一般例外的原因。

这些HRESULT值实际上是在Windows SDK附带的Windows头文件中定义的。在使用C或C ++编写Windows应用程序时,您会#include这些标题,但在.NET的托管环境中,您需要通过将适当的定义复制到源文件中来自己定义它们。

好消息是,至少在Windows上,这个价值不太可能发生变化,因为向后兼容性有多重要,有多少应用程序会破坏。像这样的值可以合理地假设为常量。尽管如此,我仍然不会将它们硬编码为“神奇数字”。通过定义一个公共常量(如上所述),它更改,您只需要在一个地方更改代码然后重新编译。

就Mono而言,如果他们需要这个值,他们最终将完成与上述相同的事情。在他们的运行时版本的源文件中的某个地方有一堆声明,如internal const int ...