.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 值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章