#c# #try-catch #registry
#c# #попробуйте-поймайте #реестр
Вопрос:
Мне нужно создать приложение на WinForm C # в качестве моего окончательного проекта программирования. Проект направлен на более эффективное управление реестром, чтобы пользователю было проще редактировать значения.
Проблема в том, что когда я читаю, существует ли строка UninstallString или нет, функция по какой-то причине не просматривает catch внутри try при сбое (и это не удается, поскольку приложение не является 64-разрядным, поэтому к значению реестра нужно обращаться по-другому)
public bool ValueExists(string Key, string Value)
{
try
{
try
{
RegistryKey rk = Registry.LocalMachine.OpenSubKey(Key);
return rk.GetValue(Value) != null; //Error happens here when selected 64-bit application. System.NullReferenceException: 'Object reference not set to an instance of an object.'
}
catch (NullReferenceException ex)
{
RegistryKey regkey64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
RegistryKey rk64 = regkey64.OpenSubKey(Value);
return regkey64.OpenSubKey(Key).GetValue(Value) != null;
}
}
catch
{
return false;
}
}
System.NullReferenceException: ‘Ссылка на объект не установлена для экземпляра объекта.’ — Это ошибка, и я ЗНАЮ, что это происходит, потому что я выбираю 64-разрядное приложение, но по какой-то причине оно игнорирует catch.
Комментарии:
1. Получите трассировку стека, где это происходит
2. Поставьте точку останова в этой строке. Равно
rk
null? Если да, то почему и обработайте его.3. Оно нечитаемо, поскольку это 64-разрядное значение реестра (то есть, если я выберу 32-разрядное приложение, это исключение не произойдет), поэтому я сделал это исключение. Что еще я могу сделать, чтобы справиться с этим?
4. так что это
rk
null?5. Как вы установили 64-разрядность своего приложения? Не могли бы вы показать код / проект? Вы уверены, что
rk
это значение равно null (с использованием отладчика)?
Ответ №1:
Пользователь по имени Ричард Диминг решил проблему для меня в CodeProject
Он предложил совершенно другой подход. Вместо того, чтобы использовать catch, он проверяет, является ли процесс 64-разрядным, и таким образом он указывает коду, следует ли принудительно считывать 64-разрядное значение реестра или нет (зависит от выбранной программы). Это его код (с исправлением, которое я сделал):
public bool ValueExists(string Key, string Value)
{
using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(Key, false))
{
if (rk != null) return rk.GetValue(Value) != null;
}
if (Environment.Is64BitOperatingSystem amp;amp; !Environment.Is64BitProcess)
{
RegistryKey regkey64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
return regkey64.OpenSubKey(Key).GetValue(Value) != null;
}
return false;
}