c# - 从 .NET 设置特定的 COM HRESULT 值

标签 c# exception com com-interop hresult

我正在创建一个 .NET 程序集,它需要通过 COM 调用,例如VB6等

大部分工作正常 - 我现在正在微调我的错误处理。

我想做的是为我的异常创建特定的 HRESULT 值 - 例如对于我的异常情况,使用 0x88880001 等值。 我想使用一个通用的“前缀”(如 0x8888),然后将我的内部错误代码(从十进制 1001 向上运行)添加到该数字。

所以我的内部错误 1001 应该变成 HRESULT = 0x888803E9 等等。

我有自己的自定义 .NET 异常类,我知道我可以在基 ApplicationException 类上设置 protected HResult 属性 - 但不知何故我无法管理让我的“前缀”加上我的错误代码工作....

使用系统;

public class CustomException : ApplicationException
{
    public CustomException(string message, int errorCode) : base(message)
    {
        base.HResult = (uint) 0x88880000 + errorCode;
    }
}

无论我在这里尝试什么 - 我就是无法获得一个 int 值(对于 base.HResult,它是一个 int)表示要存储到我的基类中的 0x888803E9...

我在这里错过了什么??

最佳答案

C# 编译器只是麻烦您阻止您触发溢出错误。有道理的是,许多此类代码无法在溢出检查中幸存下来,这不是您在错误处理代码中想要的那种不幸:)请注意,被赞成的答案中的代码如何通过项目 > 属性 > 构建 > 高级 >“检查算术溢出/下溢”选项打勾。一个未被充分使用的选项。

您必须使用 unchecked 关键字来禁止此运行时检查:

  base.HResult = unchecked((int)(0x88880000U + errorCode));

或者你可以在编译时抑制它:

  const int ErrorBase = unchecked((int)0x88880000);
  base.HResult = ErrorBase + errorCode;

令人痛苦的是:您将生成的 HRESULT 不是有效的,它没有正确的设施代码。该代码提供了错误来源的提示。互操作代码应使用 0x80040000 作为错误基础来选择 FACILITY_ITF。虽然不确定您是否会因为 0x88880000 而感到悲伤,但您生成的消息字符串是最重要的。不幸的是,ISupportErrorInfo 往往会在客户端代码中被跳过,因此不能很好地保证任何人都能真正看到它。

关于c# - 从 .NET 设置特定的 COM HRESULT 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31405057/

相关文章:

c# - C# 中的正则表达式问题返回匹配为真

c# - 异常记录和发送电子邮件

debugging - 何时应使用 -g 在 OCaml 中打印堆栈跟踪?

android - AdMob 激励视频广告错误(异常)

时间:2019-03-08 标签:c#programloadc++com

c# - 如何使用COM接口(interface)调试应用程序?

c# - .NET Color 中的 RGB 格式

c# - 读取 4000 个文件后抛出 System.OutOfMemoryException

c++ - 未能释放Direct3D Device "or"对应上下文

c# - Unity3D - Android 通信?