C++和C#之间HRESULT的转换
Conversion of HRESULT between C++ and C#
我有使用反射等从 C# 调用的 C++ 代码
我遇到的奇怪的事情是在 C++ 端函数声明看起来像这样
dppFUNC(HRESULT) dppOnlineGetBalanceInfo(
在 C# 端它被声明为
[DllImport("dppClientModule.dll", CallingConvention = CallingConvention.StdCall)]
private static extern UInt32 dppOnlineGetBalanceInfo(
为什么 C# 代码中的 return 类型是 uint
?不应该是int
吗?
它会导致什么问题?现在已经这样使用了,请问会造成什么问题?
重复的链接问题似乎有所不同,因为接受的答案中 MAKEHRESULT(C# 版本)的结果是 int,为什么?
HRESULT
在 C/C++ 中被定义为长整数(32 位有符号)。所以从技术上讲,在 C# 中,您将使用 int
。这也是 Microsoft 本身在 C# 中用于 Exception.HResult.
的类型
使用 int
而不是 uint
的缺点是您必须显式转换,同时禁用溢出检查 (unchecked
), all the constants listed in the MSDN documentation:
例如:
const int E_FAIL = 0x80004005;
Cannot implicitly convert type 'uint' to 'int'. An explicit conversion exists (are you missing a cast?)
添加显式转换:
const int E_FAIL = (int)0x80004005;
Constant value '2147500037' cannot be converted to a 'int' (use 'unchecked' syntax to override)
现在,您有三个选择:
const int E_FAIL = -2147467259;
const int E_FAIL = unchecked((int)0x80004005);
const uint E_FAIL = 0x80004005;
使用负值无助于提高可读性。因此,要么将所有常量定义为 unchecked((int)...)
,要么将 HRESULT
视为 uint
.
我有使用反射等从 C# 调用的 C++ 代码
我遇到的奇怪的事情是在 C++ 端函数声明看起来像这样
dppFUNC(HRESULT) dppOnlineGetBalanceInfo(
在 C# 端它被声明为
[DllImport("dppClientModule.dll", CallingConvention = CallingConvention.StdCall)]
private static extern UInt32 dppOnlineGetBalanceInfo(
为什么 C# 代码中的 return 类型是 uint
?不应该是int
吗?
它会导致什么问题?现在已经这样使用了,请问会造成什么问题?
重复的链接问题似乎有所不同,因为接受的答案中 MAKEHRESULT(C# 版本)的结果是 int,为什么?
HRESULT
在 C/C++ 中被定义为长整数(32 位有符号)。所以从技术上讲,在 C# 中,您将使用 int
。这也是 Microsoft 本身在 C# 中用于 Exception.HResult.
使用 int
而不是 uint
的缺点是您必须显式转换,同时禁用溢出检查 (unchecked
), all the constants listed in the MSDN documentation:
例如:
const int E_FAIL = 0x80004005;
Cannot implicitly convert type 'uint' to 'int'. An explicit conversion exists (are you missing a cast?)
添加显式转换:
const int E_FAIL = (int)0x80004005;
Constant value '2147500037' cannot be converted to a 'int' (use 'unchecked' syntax to override)
现在,您有三个选择:
const int E_FAIL = -2147467259;
const int E_FAIL = unchecked((int)0x80004005);
const uint E_FAIL = 0x80004005;
使用负值无助于提高可读性。因此,要么将所有常量定义为 unchecked((int)...)
,要么将 HRESULT
视为 uint
.