2010-10-11 4 views
1

Я получаю ошибку NullReferenceException для некоторого простого кода для обработки события нажатия кнопки. У меня все еще есть немного кода для добавления в самом конце, чтобы фактически отобразить значение из «TcpAddr» в окне сообщений. Это позволит вам запустить программу, но нажатие кнопки заставляет ее выкидывать ошибку.C# NullReferenceException при чтении раздела реестра

Также: лучше ли переместить фактический запрос из события click и просто сделать обработчик события MessageBox.Show()?

using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using Microsoft.Win32; 

namespace LiteSwitch 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      RegistryKey RegKey = Registry.LocalMachine; 
      RegKey = RegKey.OpenSubKey("SOFTWARE\\Altiris\\Client Service"); 
      object CurrDS = RegKey.GetValue("TcpAddr"); //This line causes the NRE Error 
      MessageBox.Show("Current DS:"); 
     } 
    } 
} 
+4

Я настоятельно рекомендовал бы, чтобы ваши переменные начинались с нижнего регистра. (Например, 'regKey' вместо' RegKey'). –

ответ

5

Если вы уверены, что раздел реестра действительно существует (используйте Regedit.exe), то у вас возникнет проблема, если вы работаете в 64-разрядной версии Windows. Проект VS2010 вынужден запускаться в 32-битном режиме по умолчанию, он видит другой набор ключей реестра.

Project + Properties, вкладка Build, Platform Target = Любой процессор. Повторите настройку Release.

+0

+1 для уведомления о 64-битной конфигурации. – TalentTuner

+0

Спасибо, я запускаю это на 64-битной Windows 7. Я проверю это и отчитаюсь. –

+0

Я не рассматриваю это как вариант, это VS2010 Express, это недостающий вариант в экспресс-версии? –

4

Я думаю, что

RegKey = RegKey.OpenSubKey("SOFTWARE\\Altiris\\Client Service"); 

возвращается нуль, вероятно, потому, что ключ не существует.

Проверьте, существует ли ключ, и указан правильный путь ретрансляции.

+0

Путь существует полностью как HKLM \ SOFTWARE \ Altiris \ Client Service, а строка, которую я хочу, это TcpAddr. В пакетном файле это будет написано как REG QUERY «HKLM \ SOFTWARE \ Altiris \ Client Service»/v TcpAddr –

0

Если оно выбрасывает NRE, это потому, что оно не может найти значение, убедитесь, что оно написано правильно или что предыдущая строка также не возвращается null.

3

Согласно the documentation for OpenSubKey(), «Если указанный подраздел не может быть найден, возвращается значение null». Если переменная имеет значение null, вызов метода на нее будет вызывать это исключение.


«Лучше ли практика перенести фактический запрос из события щелчка и просто сделать ручку события щелчка MessageBox.Show()?»

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

+0

Должен ли этот путь полностью представлять путь к значению? ie-add \ TcpAddr до конца? TcpAddr - это строка, которая не является ключом –

Смежные вопросы