DWORD应该映射到int还是uint?

时间:2011-07-17 17:34:10

标签: c# .net winapi pinvoke dword

将Windows API(包括数据类型)翻译成P / Invoke时,我应该用int还是uint替换DWORD?

它通常是未签名的,但我发现人们在任何地方使用int代替(仅仅是因为CLS警告?even the .NET Framework itselfthis),所以我从来不确定哪一个是正确使用的。

7 个答案:

答案 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