5

我注意到写入注册表时的值应该是有符号整数,而不是无符号整数DWordQWord如果值为 UInt64 或 UInt32,此代码将引发异常:

registryKey.SetValue(name, value);

根据 MSDNDWORD是一个 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方法将引发异常。我是错过了什么还是我只是迟钝?

4

2 回答 2

5

由于历史原因,.NET API/库通常是“签名的”而不是“签名的 + 未签名的”。

但是最终asigned int和aunsigned int都占用了相同的内存空间,对于负值没有做特殊处理。所以你可以按照你说的做:将无符号值转换为有符号,用它写,SetValue然后如果你查看其中的值,Regedit你会发现它被写成“无符号”。

请注意,如果您的程序以“已检查”模式编译,则更正确的代码将是:

uint unsignedValue = ... // Your original value

int signedValue = unchecked((int)unsignedValue);
registryKey.SetValue(name, signedValue);

因为在“已检查”模式下,如果无法进行转换,则 and 之间intuint转换可能会引发异常。

请注意,如此所写:

SetValue 的这种重载将 64 位整数存储为字符串 (RegistryValueKind.String)。要将 64 位数字存储为 RegistryValueKind.QWord 值,请使用指定 RegistryValueKind 的 SetValue(String, Object, RegistryValueKind) 重载。

显然,您必须对有符号无符号进行相同的处理。

于 2015-06-09T09:34:04.797 回答
1

RegistryKey.SetValue页面的示例中:

// Numeric values that cannot be interpreted as DWord (int) values
// are stored as strings.

似乎存储的值是带符号的整数或字符串。

于 2015-06-09T09:30:26.950 回答