将Windows API(包括数据类型)翻译成P / Invoke时,我应该用int
还是uint
替换DWORD?
它通常是未签名的,但我发现人们在任何地方使用int
代替(仅仅是因为CLS警告?even the .NET Framework itself做this),所以我从来不确定哪一个是正确使用的。
答案 0 :(得分:43)
好according to the MSDN DWORD
是无符号整数,范围为0到4294967295。
理想情况下,您应该将其替换为uint
而不是int
。
但是,正如您发现uint
符合非CLS标准,因此如果您的方法公开可见,则应使用int
并进行转换。这样做的必然结果是,如果您的方法未在程序集外部使用,则应将其标记为internal
而不是public
。然后你就可以使用uint
。
答案 1 :(得分:2)
它是无符号的,因此将其映射到uint
。
答案 2 :(得分:2)
使用int。原因是,如果我使用 uint 变量更改" AutoRestartShell" :
regKey.SetValue("AutoRestartShell", uintVariable);
注册表编辑器中的数据类型更改为" REG_SZ" 。如果我要求退回该值:
regKey.GetValue("AutoRestartShell");
返回字符串。
但是,如果我使用 int 变量更改" AutoRestartShell" :
regKey.SetValue("AutoRestartShell", intVariable);
数据类型保持为" REG_DWORD" 。
为什么会这样?不知道。我所知道的就是它。逻辑当然会告诉我们应该使用uint,但这会改变我们不想要的数据类型。
答案 3 :(得分:1)
根据(Microsoft)的定义,DWORD是无符号的32位整数。它应该映射到编译器用来表示它的任何类型。
这些天它很可能是unsigned int,但这不是一个可移植的实现。我知道你正在使用C#,但是为了给你一个我更熟悉的语言的例子,C中的典型实现可能是:
#if defined(SOME_HARDWARE_IMPLEMENTATION)
#define DWORD unsigned int
#elif #defined(SOME_OTHER_IMPLEMENTATION)
#define DWORD unsigned long
#elif #defined(YET_ANOTHER_IMPLEMENTATION)
#define DWORD something_else
#else
#error Unsupported hardware; cannot map DWORD
#endif
答案 4 :(得分:1)
仅当P / Invoke方法在程序集外部可见时,CLS合规性警告才适用,这通常意味着该呼叫是公共的。如果该方法不是外部可见的,则可以使用uint
。
答案 5 :(得分:0)
可悲的是,读取注册表必须使用int,否则抛出exception.this microsoft code:
private static void Get45or451FromRegistry()
{
using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full\\")) {
if (ndpKey != null && ndpKey.GetValue("Release") != null) {
Console.WriteLine("Version: " + CheckFor45DotVersion((int) ndpKey.GetValue("Release")));
}
else {
Console.WriteLine("Version 4.5 or later is not detected.");
}
}
}
虽然发布是REG_DWORD
答案 6 :(得分:0)
根据官方Platform invoke data types映射表DWORD
对应于C#中的 System.UInt32
。