Как поместить DWORD в реестр с установленным старшим битом - PullRequest
18 голосов
/ 07 июля 2011

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

Пример: когда я делаю что-то подобное

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

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

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

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

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

Ответы [ 2 ]

27 голосов
/ 07 июля 2011

My думаю , что вам нужно использовать вместо int со знаком. Так что просто конвертируйте это так:

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

Я согласен, что это немного странно, если учесть, что DWORD обычно без знака (IIRC), но, по крайней мере, стоит попробовать ...

0 голосов
/ 06 сентября 2013

Я знаю, что это безумие в последнее время, однако, если вы не хотите использовать непроверенный или используете VB.Net там, где его нет, то сработало бы следующее:

Byte[] byteArray = BitConverter.GetBytes(0xf0000000u);
int USignedIntTooBigForInt = BitConverter.ToInt32(byteArray, 0);
regKey.SetValue("Value", USignedIntTooBigForInt, RegistryValueKind.DWord);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...