Подтвердить что ты не робот

Как поместить DWORD в реестр с максимальным набором бит

У меня возникла странная проблема: при установке значений типа DWORD в реестре Windows из моего приложения С# я продолжаю получать ошибки, когда установлен самый старший бит. По-видимому, существует какая-то проблема преобразования между целыми числами без знака.

Пример: когда я делаю что-то вроде этого

regKey.SetValue("Value", 0x70000000u, RegistryValueKind.DWord);

он отлично работает. Но когда я добавляю самый старший бит (который, поскольку я имею дело с целыми без знака, должен быть просто еще одним битом значения), например

regKey.SetValue("Value", 0xf0000000u, RegistryValueKind.DWord);

Я получаю исключение ( "Тип объекта значения не соответствует указанному RegistryValueKind или объект не может быть правильно преобразован" ).

Но разве это не должно работать? DWORD - это неподписанный 32-разрядный целочисленный тип данных, а также литерал 0xf0000000u (С# автоматически присваивает ему тип данных UInt32), поэтому они должны быть идеально подходящими (и вручную задавать значение в редакторе реестра "0xf0000000", отлично работает тоже). Это ошибка в .NET или я что-то не так?

4b9b3361

Ответ 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);