繁体   English   中英

尝试使用 C# 在 Windows 注册表中设置 DWORD 值时出错

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM