在C和x2B之间转换HRESULT+;和C# < >我有C++代码,用反射等调用C。 P>我遇到的奇怪的事情是C++边函数声明看起来像这个< /P> dppFUNC(HRESULT) dppOnlineGetBalanceInfo(

在C和x2B之间转换HRESULT+;和C# < >我有C++代码,用反射等调用C。 P>我遇到的奇怪的事情是C++边函数声明看起来像这个< /P> dppFUNC(HRESULT) dppOnlineGetBalanceInfo(,c#,winapi,hresult,C#,Winapi,Hresult,在C#侧,它被声明为 [DllImport("dppClientModule.dll", CallingConvention = CallingConvention.StdCall)] private static extern UInt32 dppOnlineGetBalanceInfo( 为什么C#codeuint上的返回类型是?它不应该是int 它会导致什么问题?现在已经这样使用了,我想知道它会导致什么问题 作为重复的链接问题似乎有所不同,因为在接受答案中MAKEHRESULT(C#ve

在C#侧,它被声明为

[DllImport("dppClientModule.dll", CallingConvention = CallingConvention.StdCall)]
private static extern UInt32 dppOnlineGetBalanceInfo(
为什么C#code
uint
上的返回类型是?它不应该是
int

它会导致什么问题?现在已经这样使用了,我想知道它会导致什么问题


作为重复的链接问题似乎有所不同,因为在接受答案中MAKEHRESULT(C#version)的结果是int,为什么?

HRESULT
在C/C++中定义为长(32位有符号)。所以从技术上讲,在C#中,您将使用
int
。这也是微软自己在C#for中使用的类型

uint
上使用
int
的缺点是,在禁用溢出检查()的同时,必须显式强制转换以下列表中列出的所有常量:

例如:

const int E_FAIL = 0x80004005;
无法将类型“uint”隐式转换为“int”。存在显式转换(是否缺少强制转换?)

添加显式强制转换:

const int E_FAIL = (int)0x80004005;
无法将常量值“2147500037”转换为“int”(使用“unchecked”语法替代)

现在,您有三种选择:

const int E_FAIL = ‭-2147467259‬;
const int E_FAIL = unchecked((int)0x80004005);
const uint E_FAIL = 0x80004005;

使用负值无助于提高可读性。因此,要么将所有常量定义为未选中((int)…),要么将
HRESULT
视为
uint

否,HRESULT是32位无符号整数。@ChristianKiewiet的可能重复项:您能参考一些说明HRESULT是32位无符号整数的文档吗?请参考Wouter Huysentruit的回答。@ChristianKiewiet:An
HRESULT
是有符号的。如果不是这样,则该值将永远不会为真。