.NET 是不是定义了常见的 HRESULT 值? [复制]

Posted

技术标签:

【中文标题】.NET 是不是定义了常见的 HRESULT 值? [复制]【英文标题】:Does .NET define common HRESULT values? [duplicate].NET 是否定义了常见的 HRESULT 值? [复制] 【发布时间】:2015-10-09 11:08:54 【问题描述】:

我正在用 C# 创建一个 COM 类,它将从非托管 C++ 中调用。我想使用ThrowExceptionForHR,但我不想硬编码 HRESULT 数值。

我期待在 .Net 的某个地方会有一些常见的 HRESULT 值的枚举?

换句话说,我在哪里可以找到映射到 HRESULT 值的命名符号以传递给ThrowExceptionForHR

更新:

MS 在此页面中讨论它:HRESULT Information in Managed Code。他们引用了 VSConstants 类 Microsoft.VisualStudio.VSConstants,但是当我尝试使用它时,它声称命名空间不存在。

【问题讨论】:

在参考源中搜索一个? referencesource.microsoft.com/#q=E_NOTIMPL 好像有很多! 我不认为标记的问题是骗人的。我不是专门进行枚举,只是任何命名值,因此我可以避免输入原始数值。作为@AlexK。指出一些符号 do 存在,但不清楚我应该使用哪个类。 要使用VSConstants 类,您必须安装以下包:nuget.org/packages/Microsoft.VisualStudio.Shell.14.0 【参考方案1】:

是的,.NET 预定义了 HRESULT 值。您通过帮助来使用它们,就像托管程序使用您的库时一样,抛出一个标准的 .NET 异常。如果匹配很明显(例如 OutOfMemoryException == 0x800700E),异常的 HResult 属性值有时会匹配一个常见的 HRESULT 值,通常是 0x8013xxxx 值。

xxxx 值被广泛记录并列在 CorError.h SDK 头文件中。 IErrorInfo::GetDescription() 为您提供异常的 Message 属性值。自动本地化,不错。您无法获得神圣的堆栈跟踪。

【讨论】:

这是非常有用的信息,但是 - 假设我想要/需要使用 ThrowExceptionForHR .NET 是否为常见的 HRESULT 值预定义了符号,我在哪里可以找到它们?我相应地编辑了我的问题。 它们被嵌入到各种异常类的源代码中。如果您想查看,请使用 referencesource.microsoft.com。关键是你不应该想看到它。 我可以看到通常是这种情况,但事实是,MS 提供此 API 方法作为通过互操作将故障发送到 C++ 的一种方式。我找到了这个页面:msdn.microsoft.com/en-us/library/bb164625.aspx 当然,如果你想硬编码一个 HRESULT 值,你可以使用它。你不想做的事情。 get the stack trace也可以。

以上是关于.NET 是不是定义了常见的 HRESULT 值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

HRESULT宏的介绍

HRESULT:区分自定义代码和系统一

无法加载文件或程序集 X 或其依赖项之一。不是有效的Win32应用程序。 (HRESULT:0x800700C1)

为 HRESULT 代码生成诊断消息?

IDL中的HRESULT值

无法加载文件或程序集“Newtonsoft.Json.Net”(HRESULT 异常:0x80131040)