2015-07-25 2 views
0

Этот код ниже проверяет, работает ли MySQL, работает отлично.Чтение реестра DWORD

public bool MySql() 
    { 
     try 
     { 
      using (var key = Registry.CurrentUser.OpenSubKey("Software\\MySQL AB\\MySQL Server 5.6")) 
      { 
       var keyObject = key?.GetValue("installed"); 

       var keyToString = keyObject?.ToString(); 

       if (keyToString == "1") 
        return true; 
      } 
      return false; 
     } 
     catch (Exception) 
     { 
      return false; 
     } 
    } 

Однако, используя тот же код, я пытаюсь проверить, установлен ли OpenSSL.

public bool OpenSsl() 
    { 
     try 
     { 
      using (var key = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (64-bit)_is1")) 
      { 
       var keyObject = key?.GetValue("NoModify"); 

       var keyToString = keyObject?.ToString(); 

       if (keyToString == "1") 
        return true; 
      } 
      return false; 
     } 
     catch (Exception) 
     { 
      return false; 
     } 
    } 

Установка контрольных точек в коде показала, что ключ возвращает нуль. Я не знаю, почему. Да, путь правильный.

+1

Возможно, вы читаете неправильный реестр. Является ли это записью в 64-битном реестре или в 32-разрядном реестре? https://msdn.microsoft.com/en-us/library/windows/desktop/ms724072(v=vs.85).aspx – Ben

ответ

0

32-разрядное приложение на 64-разрядной ОС направлено в HKLM \ Software \ Wow6432Node. Чтобы прочитать 64-разрядную версию ключа, необходимо использовать образец кода RegistryView

C# 4.0

public static RegistryKey GetRegistryKey(string keyPath) 
    { 
     RegistryKey localMachineRegistry 
      = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, 
             Environment.Is64BitOperatingSystem 
              ? RegistryView.Registry64 
              : RegistryView.Registry32); 

     return string.IsNullOrEmpty(keyPath) 
      ? localMachineRegistry 
      : localMachineRegistry.OpenSubKey(keyPath); 
    } 

Если вы используете .NET 3.5 или ниже р/вызова является единственным решением.

http://www.rhyous.com/2011/01/24/how-read-the-64-bit-registry-from-a-32-bit-application-or-vice-versa/

+0

Спасибо, я не знал о 32 и 64-битных реестрах. –

+0

Я обновил немного больше объяснений и альтернативу для .NET 3.5 и ниже. –

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