Как поместить DWORD в реестр с максимальным набором бит
У меня возникла странная проблема: при установке значений типа DWORD в реестре Windows из моего приложения С# я продолжаю получать ошибки, когда установлен самый старший бит. По-видимому, существует какая-то проблема преобразования между целыми числами без знака.
Пример: когда я делаю что-то вроде этого
regKey.SetValue("Value", 0x70000000u, RegistryValueKind.DWord);
он отлично работает. Но когда я добавляю самый старший бит (который, поскольку я имею дело с целыми без знака, должен быть просто еще одним битом значения), например
regKey.SetValue("Value", 0xf0000000u, RegistryValueKind.DWord);
Я получаю исключение ( "Тип объекта значения не соответствует указанному RegistryValueKind или объект не может быть правильно преобразован" ).
Но разве это не должно работать? DWORD - это неподписанный 32-разрядный целочисленный тип данных, а также литерал 0xf0000000u
(С# автоматически присваивает ему тип данных UInt32), поэтому они должны быть идеально подходящими (и вручную задавать значение в редакторе реестра "0xf0000000", отлично работает тоже). Это ошибка в .NET или я что-то не так?
Ответы
Ответ 1
Я предполагаю, что вам нужно использовать подписанный int
. Поэтому просто преобразуйте его так:
regKey.SetValue("Value", unchecked((int) 0xf0000000u),
RegistryValueKind.DWord);
Я согласен с этим немного странно, когда вы считаете, что DWORD обычно без знака (IIRC), но, по крайней мере, стоит попробовать...
Ответ 2
Я знаю, что это слишком поздно, однако, если вы не хотите использовать unchecked или используете VB.Net, где он недоступен, тогда будет работать и следующее.
Byte[] byteArray = BitConverter.GetBytes(0xf0000000u);
int USignedIntTooBigForInt = BitConverter.ToInt32(byteArray, 0);
regKey.SetValue("Value", USignedIntTooBigForInt, RegistryValueKind.DWord);