对如何获取 RegistryKey 值感到困惑

Confused about how get RegistryKey value

我真的很抱歉我可怜的人english.I正在编写一个程序来读取已安装的 webBrowsers 的版本信息。问题是我在下面得到这个异常

An entry with the same key already exists.

这是已安装浏览器

注册表项的路径
private const string AppPath = @"Software"

我将路径值传递给我的函数,然后我比较浏览器列表,它是这个

private readonly string[] _browserList ={"Google", "Mozilla"};

和注册表中的子键名找到匹配项。

  void GetBrowserInfo(string path)
        {
            RegistryKey key = Registry.CurrentUser.OpenSubKey(AppPath);
           Dictionary<string,string>keyvalDictionary=new Dictionary<string, string>();
            try
            {
                if (key != null)
                {

                    string[] subKeys = key.GetSubKeyNames();
                    for (int i = 0; i < subKeys.Length; i++)
                    {
                        for (int j = 0; j < _browserList.Length; j++)
                        {
                            if (Array.IndexOf(subKeys, _browserList[j]) != -1)
                            {
                                RegistryKey openSubKey = Registry.CurrentUser.OpenSubKey(AppPath);
                                if (openSubKey != null)
                                {
                                    string pathds = Path.Combine(openSubKey.ToString(), _browserList[j]);
                                    string value= SelectedBrowser(_browserList[j],pathds);
                                    keyvalDictionary.Add(_browserList[j],value);

                                }


                            }
                        }
                    }

                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }


        }




private string SelectedBrowser(string name ,string path)
        {
            string value = "";
            switch (name)
            {
                case "Google":
                    value = Registry.GetValue(path + "\Chrome\BLBeacon", "version", "").ToString();
                    break;
                case "Mozilla":
                    value = Registry.GetValue(path + @"\Mozilla Firefox.0 (x86 tr)\Uninstall", "Description", "").ToString();
                    break;

            }
            return value;
        }

这是调试输出

您不需要外循环。您正在做同样的事情 n 次(其中 n 是子键的长度)。只需删除此循环:

for (int i = 0; i < subKeys.Length; i++)

我想现在一切都会好起来的。

您收到此异常,因为在 subKeys 循环的第一次迭代后,您将相同的键添加到字典中。

 if (key != null)
            {
                int j = 0;
                string[] subKeys = key.GetSubKeyNames();
                for (int i = 0; i < subKeys.Length; i++)
                {
                    if (j < _browserList.Length)
                    {
                        if (Array.IndexOf(subKeys, _browserList[j]) != -1)
                        {
                            RegistryKey openSubKey = Registry.CurrentUser.OpenSubKey(AppPath);
                            if (openSubKey != null)
                            {
                                string pathds = Path.Combine(openSubKey.ToString(), _browserList[j]);
                                string value = SelectedBrowser(_browserList[j], pathds);
                                keyvalDictionary.Add(_browserList[j], value);
                                j++;

                            }
                        }
                    }
                    else
                        break;
                }

            }