我注意到DWord
和QWord
值写入注册表时应该是签名整数,而不是无符号。如果值为UInt64或UInt32,则此代码将引发异常:
registryKey.SetValue(name, value);
根据MSDN DWORD
是一个32位无符号整数(范围:0到4294967295十进制)https://msdn.microsoft.com/en-us/library/cc230318.aspx
因此,要向注册表写入新的DWORD
值,我需要将其转换为有符号整数,如下所示:
UInt32 unsignedValue = (UInt32)someValue;
Int32 signedValue = (Int32)unsignedValue;
registryKey.SetValue(name, signedValue);
将无符号值传递给 SetValue 方法将引发异常。 我错过了什么,或者我只是被弱智?
答案 0 :(得分:3)
对于historical reasons,.NET API /库通常是“已签名”而不是“已签名+未签名”。
但最后,signed int
和unsigned int
都占用相同的内存空间,并且没有对负值进行特殊处理。所以你可以按照你的说法做:将无符号值转换为signed,用SetValue
编写,然后如果你查看Regedit
中的值,你就会看到它被写成“unsigned”。 / p>
请注意,如果您的程序是在“已检查”模式下编译的,则更正确的代码是:
uint unsignedValue = ... // Your original value
int signedValue = unchecked((int)unsignedValue);
registryKey.SetValue(name, signedValue);
因为在“已检查”模式下,int
和uint
之间的转换如果无法进行转换,则会抛出异常。
请注意,如here所示:
SetValue的这个重载将64位整数存储为字符串(RegistryValueKind.String)。要将64位数字存储为RegistryValueKind.QWord值,请使用指定RegistryValueKind的SetValue(String,Object,RegistryValueKind)重载。
显然,您必须对signed-unsigned进行相同的处理。
答案 1 :(得分:1)
从RegistryKey.SetValue页面'示例:
// Numeric values that cannot be interpreted as DWord (int) values
// are stored as strings.
似乎存储的值是有符号的整数或字符串。