C # Чтение реестра: ProductID возвращает нулевое значение в целевом приложении x86. "Любой процессор" работает нормально - PullRequest
10 голосов
/ 10 июня 2011

Я недавно перешел на 64-битную машину W7 с VS 2010. Мой проект настроен для работы на Any CPU. Когда я изменил это значение на x86, я заметил, что некоторые из моих вызовов реестра больше не работают.

Я пытаюсь прочитать поле ProductID следующим образом:

RegistryKey windowsNTKey = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Windows NT\CurrentVersion");
object productID = windowsNTKey.GetValue("ProductId");

productID всегда равен null при работе в режиме x86, при работе в режиме «Любой процессор» он работает правильно. Что здесь происходит?

Ответы [ 3 ]

9 голосов
/ 10 июня 2011

Некоторые ключи реестра перенаправляются WOW64.Дополнительная информация по этой теме доступна на MSDN http://msdn.microsoft.com/en-us/library/aa384232(v=vs.85).aspx

Если вы действительно хотите всегда иметь доступ к узлу x64 (.Net4):

  RegistryKey localMachine = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64);
  RegistryKey windowsNTKey = localMachine.OpenSubKey(@"Software\Microsoft\Windows NT\CurrentVersion");
  object productID = windowsNTKey.GetValue("ProductId");
8 голосов
/ 10 июня 2011

Этот код получит идентификатор для всех видов архитектур ОС и программных архитектур. Можно написать короче, но мне нравится удобочитаемость

    static string GetProductId()
    {
        RegistryKey localMachine = null;
        if (Environment.Is64BitOperatingSystem)
        {
            localMachine = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64);
        }
        else
        {
            localMachine = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry32);
        }
        RegistryKey windowsNTKey = localMachine.OpenSubKey(@"Software\Microsoft\Windows NT\CurrentVersion");
        return windowsNTKey.GetValue("ProductId").ToString();
    }
3 голосов
/ 10 июня 2011

На win64 некоторые ключи реестра 32-битного приложения хранятся в подразделе Software\Wow6432Node.

Если вы хотите переключиться на 64-битный ключ, вы можете использовать перечисление RegistryView в качестве параметра RegistryKey.OpenBaseKey

Лично, чтобы код всегда работал в главном ключе реестра (не в WoW6432), я использую такую ​​конструкцию:

RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32)

...