从.NET设置特定的COM HRESULT值

时间:2015-07-14 11:15:40

标签: c# exception-handling com com-interop hresult

我正在创建一个需要COM调用的.NET程序集。 VB6等。

大多数工作正常 - 我现在正在调整我的错误处理。

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

因此我的内部错误1001应该变为HRESULT = 0x888803E9,依此类推。

我有自己的自定义.NET异常类,我知道我可以在基类HResult类上设置受保护的ApplicationException属性 - 但不知何故我无法获得我的“前缀”再加上我的错误代码......

使用System;

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

无论我在这里尝试什么 - 我都无法获得int值(base.HResult,代表int代表0x888803E9存储到我的<ul> <li ng-repeat="country in countries" type="country" class="slide"> <a ui-sref="state5"> {{country.name}}</a> </li> </ul> 基类......

我在这里缺少什么?

2 个答案:

答案 0 :(得分:6)

C#编译器只是麻烦你阻止你绊倒溢出bug。合理的说,很多这种代码都无法在溢出检查中存活,而不是你在错误处理代码中想要的那种不幸事件:)注意upvoted答案中的代码如何与Project&gt;属性&gt;构建&gt;高级&gt; &#34;检查算术溢出/下溢&#34;选项勾选。一个没有得到充分利用的选项。

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

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

或者您可以在编译时禁止它:

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

令人难以忍受的是:您生成的HRESULT不是有效的,它没有正确的设施代码。该代码提供了错误来自的提示。 Interop代码应使用0x80040000作为错误基础来选择FACILITY_ITF。不太确定你会对0x88880000感到悲伤,但是你生成的消息字符串是最重要的。不幸的是,客户端代码中往往会跳过ISupportErrorInfo,因此没有任何人真正看到它的保证。

答案 1 :(得分:2)

base.HResult = (int)((uint)0x88880000 + errorCode);

base.HResult是一个System.Int32。

然而,你的号码比Int32大,所以它会翻身。不确定您需要什么以及checked是否有帮助。

然而,这似乎结束了:

void Main()
{
    var ce = new CustomException("uh oh", 1001);
    Console.WriteLine(ce.HResult);
    // Convert integer as a hex in a string variable
    string hexValue = ce.HResult.ToString("X");
    // Convert the hex string back to the number
    int decAgain = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);        
    Console.WriteLine(hexValue);
    Console.WriteLine(decAgain);
}


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

最佳做法是从Exception类派生所有异常。