从 .NET 设置特定的 COM HRESULT 值
Setting specific COM HRESULT value from .NET
我正在创建一个 .NET 程序集,它需要通过 COM 调用,例如VB6 等
大部分工作正常 - 我现在正在微调我的错误处理。
我想做的是为我的异常创建特定的 HRESULT
值 - 例如对于我的异常情况,使用 0x88880001
等值。
我想使用一个常见的 "prefix"(如 0x8888
),然后将我的内部错误代码(运行 从十进制 1001 向上)添加到该数字。
所以我的内部错误 1001 应该变成 HRESULT = 0x888803E9
等等。
我有自己的自定义 .NET 异常 class,我知道我可以在基础 ApplicationException
class 上设置受保护的 HResult
属性 - 但不知何故我无法让我的 "prefix" 加上我的错误代码工作....
使用系统;
public class CustomException : ApplicationException
{
public CustomException(string message, int errorCode) : base(message)
{
base.HResult = (uint) 0x88880000 + errorCode;
}
}
无论我在这里尝试什么 - 我就是无法获得表示要存储的 0x888803E9
的 int
值(对于 base.HResult
,这是一个 int
)进入我的基地 class...
我在这里错过了什么??
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);
}
}
最佳做法是所有异常都派生自异常 class。
C# 编译器只是麻烦您阻止您触发溢出错误。有道理的是,许多此类代码无法在溢出检查中幸存下来,而不是您在错误处理代码中想要的那种不幸:)请注意,被赞成的答案中的代码如何通过 Project > Properties > Build > Advanced > "Check for arithmetic overflow/underflow" 选项打勾。一个没有被充分使用的选项。
您必须使用 unchecked 关键字来禁止此运行时检查:
base.HResult = unchecked((int)(0x88880000U + errorCode));
或者你可以在编译时抑制它:
const int ErrorBase = unchecked((int)0x88880000);
base.HResult = ErrorBase + errorCode;
令人痛苦的是:您将生成的 HRESULT 无效,它没有正确的设施代码。该代码提供了错误来源的提示。互操作代码应使用 0x80040000 作为 select FACILITY_ITF 的错误基础。虽然不确定您是否会因为 0x88880000 而感到悲伤,但您生成的消息字符串是最重要的。不幸的是,ISupportErrorInfo 往往会在客户端代码中被跳过,因此不能很好地保证任何人都能真正看到它。
我正在创建一个 .NET 程序集,它需要通过 COM 调用,例如VB6 等
大部分工作正常 - 我现在正在微调我的错误处理。
我想做的是为我的异常创建特定的 HRESULT
值 - 例如对于我的异常情况,使用 0x88880001
等值。
我想使用一个常见的 "prefix"(如 0x8888
),然后将我的内部错误代码(运行 从十进制 1001 向上)添加到该数字。
所以我的内部错误 1001 应该变成 HRESULT = 0x888803E9
等等。
我有自己的自定义 .NET 异常 class,我知道我可以在基础 ApplicationException
class 上设置受保护的 HResult
属性 - 但不知何故我无法让我的 "prefix" 加上我的错误代码工作....
使用系统;
public class CustomException : ApplicationException
{
public CustomException(string message, int errorCode) : base(message)
{
base.HResult = (uint) 0x88880000 + errorCode;
}
}
无论我在这里尝试什么 - 我就是无法获得表示要存储的 0x888803E9
的 int
值(对于 base.HResult
,这是一个 int
)进入我的基地 class...
我在这里错过了什么??
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);
}
}
最佳做法是所有异常都派生自异常 class。
C# 编译器只是麻烦您阻止您触发溢出错误。有道理的是,许多此类代码无法在溢出检查中幸存下来,而不是您在错误处理代码中想要的那种不幸:)请注意,被赞成的答案中的代码如何通过 Project > Properties > Build > Advanced > "Check for arithmetic overflow/underflow" 选项打勾。一个没有被充分使用的选项。
您必须使用 unchecked 关键字来禁止此运行时检查:
base.HResult = unchecked((int)(0x88880000U + errorCode));
或者你可以在编译时抑制它:
const int ErrorBase = unchecked((int)0x88880000);
base.HResult = ErrorBase + errorCode;
令人痛苦的是:您将生成的 HRESULT 无效,它没有正确的设施代码。该代码提供了错误来源的提示。互操作代码应使用 0x80040000 作为 select FACILITY_ITF 的错误基础。虽然不确定您是否会因为 0x88880000 而感到悲伤,但您生成的消息字符串是最重要的。不幸的是,ISupportErrorInfo 往往会在客户端代码中被跳过,因此不能很好地保证任何人都能真正看到它。