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

C# 尝试使用C在windows注册表中设置DWORD值时出错#,c#,.net,registry,uint32,dword,C#,.net,Registry,Uint32,Dword,我正在编写在Windows注册表中设置值的代码。当我手动设置该值时,它会按预期工作;但是,当我想以编程方式设置该值时,它会给出一个错误。我要定义的值是DWORD值类型,即“4294967295”。但是,当我在脚本中定义它时,它表示DWORD不支持此值。然而,我可以通过我用来手动更新注册表的程序来指定准确的值 这是我的密码: RegistryKey key=Registry.CurrentUser.OpenSubKey(@“软件\Lost in Days Studio\NO TIME”,true)

我正在编写在Windows注册表中设置值的代码。当我手动设置该值时,它会按预期工作;但是,当我想以编程方式设置该值时,它会给出一个错误。我要定义的值是DWORD值类型,即“4294967295”。但是,当我在脚本中定义它时,它表示DWORD不支持此值。然而,我可以通过我用来手动更新注册表的程序来指定准确的值

这是我的密码:

RegistryKey key=Registry.CurrentUser.OpenSubKey(@“软件\Lost in Days Studio\NO TIME”,true);
key.SetValue(“当前”,4294967295,RegistryValueKind.DWord);
key.Close();

正如您可能知道的,DWORD是。然而,不太明显的是,它是无符号的,因此是
UInt32
uint
)。否则,您将无法存储值
4294967295
,因为

然而,有一个陷阱!正如@Jimi在评论中指出的,
SetValue()
将尝试执行
Convert.ToInt32()
,这将导致任何高于
Int32.MaxValue的值溢出,从而收到错误。人们希望它使用
Convert.ToUInt32()
,但正如@Jimi也发现的那样,由于向后兼容性问题,微软无法修复这一问题

相反,
SetValue()
方法将有符号的
Int32
int
)转换为无符号的32位二进制数,值
0…2147483647
保持不变,但
-2147483647…-1
的值保存到
2147483648…4294967295
范围

如果你把它看作一个有符号整数,那么二进制转换有点复杂。但是,幸运的是,您可以使用允许溢出,并在这些范围内有效地将您的
uint
视为有符号的
int

key.SetValue(“当前”,未选中((int)4294967295),RegistryValueKind.DWord);

这非常方便,因为它允许您继续使用标准的
UInt32
uint
)范围
0…4294967295
,就像您通过RegEdit那样,而不必考虑如何处理二进制转换

您好,欢迎来到Stack Overflow!我假设通过手动设置值,您的意思是通过例如
RegEdit.msc
或类似的应用程序?出于好奇,您使用什么应用程序手动编辑您的Windows注册表?我通过regedit,我正在编辑的程序是一个游戏当调用
RegistryKey.SetValue
时,使用
RegistryValueKind.DWord
,该方法尝试
转换.ToInt32()
您传递的值。改用
QWord
。如果不指定类型并设置
uint.MaxValue
,它将存储一个字符串。@吉米:既然DWORD
是无符号整数,它不应该在内部调用
Convert.ToUInt32()
?也就是说,如果是这样的话,我希望OP的代码能够正常工作,因为值为
uint的
long
。MaxValue
显然可以转换为
uint
。问题#24954-(无法修复)。