[英]Error when trying to set a DWORD value in the windows registry using C #
我正在编写在 Windows 注册表中设置值的代码。 当我手动设置该值时,它按预期工作; 但是,当我想以编程方式设置该值时,会出现错误。 我要定义的值是一个 DWORD 值类型,即“4294967295”。 但是,当我在脚本中定义它时,它说 DWORD 不支持这个值。 而且,我可以通过我用来手动更新注册表的程序分配该确切值。
这是我的代码:
RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Lost in Days Studio\NO TIME", true);
key.SetValue("Current", 4294967295, RegistryValueKind.DWord);
key.Close();
您可能知道,DWORD 存储为 32 位二进制数。 然而,可能不是很明显的是,它是无符号的——因此,是一个UInt32
( uint
)。 否则,您将无法存储4294967295
的值,因为有符号整数 ( int
) 的最大值是 2,147,483,647 。
然而,有一个问题! 正如@Jimi 在评论中指出的那样, SetValue()
将尝试执行Convert.ToInt32()
,这将导致Int32.MaxValue
之上的任何值溢出 - 因此您收到错误。 人们会期望它使用Convert.ToUInt32()
但是,正如@Jimi还发现的那样,这是方法中的一个已知错误,由于向后兼容性问题,Microsoft 无法修复该错误。
相反, SetValue()
方法将有符号的Int32
( int
) 转换为无符号的 32 位二进制数,其中0…2147483647
值保持原样,但-2147483647…-1
值被保存到2147483648…4294967295
范围内。
如果您将其视为有符号整数,则该二进制转换有点令人费解。 但是,幸运的是,您可以使用C# 的内置unchecked()
关键字来允许溢出并有效地将您的uint
视为这些范围内的有符号int
:
key.SetValue("Current", unchecked((int)4294967295), RegistryValueKind.DWord);
这真的很方便,因为它允许您继续使用0…4294967295
的标准UInt32
( uint
) 范围,就像通过 RegEdit 一样,而无需考虑如何处理二进制转换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.