C# 读取注册表项时出现C NullReferenceException
我在处理按钮单击事件的一些简单代码中遇到了NullReferenceException错误。我仍然需要在最后添加一些代码,以便在messagebox上实际显示来自TCPADD的值。这将允许您运行程序,但单击按钮会导致程序抛出错误 另外:将实际查询移出click事件并使click事件处理MessageBox.Show是更好的做法吗C# 读取注册表项时出现C NullReferenceException,c#,visual-studio-2010,C#,Visual Studio 2010,我在处理按钮单击事件的一些简单代码中遇到了NullReferenceException错误。我仍然需要在最后添加一些代码,以便在messagebox上实际显示来自TCPADD的值。这将允许您运行程序,但单击按钮会导致程序抛出错误 另外:将实际查询移出click事件并使click事件处理MessageBox.Show是更好的做法吗 using System.Linq; using System.Text; using System.Windows.Forms; using Microsoft.Wi
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:");
}
}
}
我猜是这样
RegKey = RegKey.OpenSubKey("SOFTWARE\\Altiris\\Client Service");
返回null,可能是因为该键不存在
验证密钥是否存在以及提供的注册路径是否正确。我猜是这样的
RegKey = RegKey.OpenSubKey("SOFTWARE\\Altiris\\Client Service");
返回null,可能是因为该键不存在
验证密钥存在且提供的注册表路径正确。如果它抛出一个NRE,那是因为它找不到值,请确保它拼写正确,或者前一行没有返回null。如果它抛出一个NRE,那是因为它找不到值,确保拼写正确,或者前一行没有返回null。根据,如果找不到指定的子项,则返回null。如果变量为null,则对其调用方法将引发该异常 将实际查询移出click事件并使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:");
}
}
}
如果您将其取出,则它不一定反映密钥的当前值,例如,如果在您的程序运行时另一个程序对其进行了修改。根据您的程序,这可能没问题。根据,如果找不到指定的子项,则返回null。如果变量为null,则对其调用方法将引发该异常
将实际查询移出click事件并使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:");
}
}
}
如果您将其取出,则它不一定反映密钥的当前值,例如,如果在您的程序运行时另一个程序对其进行了修改。根据您的程序,这可能没问题。如果您确定注册表项确实存在,请使用Regedit.exe,如果您在64位版本的Windows上运行,则会出现问题。默认情况下,VS2010项目被迫以32位模式运行,它会看到另一组注册表项
项目+属性,构建选项卡,平台目标=任何CPU。对版本配置重复此操作。如果您确定注册表项确实存在,请使用Regedit.exe,如果您在64位版本的Windows上运行,则会出现问题。默认情况下,VS2010项目被迫以32位模式运行,它会看到另一组注册表项
项目+属性,构建选项卡,平台目标=任何CPU。对发布配置重复上述操作。我强烈建议您将变量以小写开头。例如,使用regKey而不是regKey。我强烈建议您让变量以小写开头。例如,使用regKey而不是regKey。路径完全以HKLM\SOFTWARE\Altiris\Client Service的形式存在,我想要的字符串是TcpAddr。在批处理文件中,这将被写入REG QUERY HKLM\SOFTWARE\Altiris\Client Service/v TCPADD。路径完全以HKLM\SOFTWARE\Altiris\Client Service的形式存在,我想要的字符串是TCPADD。在批处理文件中,这将被写入REG QUERY HKLM\SOFTWARE\Altiris\Client Service/v TCPADDR。该路径是否需要完全表示该值的路径?ie-将\TcpAddr添加到末尾?TcpAddr是一个字符串而不是一个键该路径是否需要完全表示该值的路径?ie-将\TcpAddr添加到末尾?TcpAddr是一个字符串而不是一个键谢谢,我在64位Windows7上运行这个。我会检查并报告。我不认为这是一个选项,这是VS2010 Express,这是Express版本中缺少的选项吗?是的,它缺少。叹气用记事本之类的文本编辑器打开.csproj并手动更改设置。它是元素,将其从x86更改为AnyCPU。谢谢,我正在64位Windows 7上运行它。我会检查并报告。我不认为这是一个选项,这是VS2010 Express,这是Express版本中缺少的选项吗?是的,它缺少。叹气用记事本之类的文本编辑器打开.csproj并手动更改设置。它是元素,将其从x86更改为AnyCPU。