2013-08-14 5 views
30

При запуске моего приложения я пытаюсь выяснить, установлена ​​ли у пользователя определенная версия установленного программного обеспечения, в частности, соединителя MySQL, все с использованием C#. В реестре MySQL содержит запись о версии. Так что я пытаюсь это сделать.Как узнать значение раздела реестра C#

Приложение запускает мое приложение. Где-то в стартовом коде мне нужно сделать следующее. Проверьте, чтобы увидеть, если пользователь имеет разъем MySQL установлен, который находится в ...

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MySQL AB\MySQL Connector/Net

Если пользователь установил разъем, я хотел проверить, какая версия у них есть, что хранится как Name = «Version» и Data = xxx (рисунок ниже)

Теперь, если у пользователя установлена ​​определенная версия, я буду выполнять другой код, из которого я могу взять.

Что было бы самым лучшим способом для этого?

enter image description here

EDIT: Ниже приведен код, который я в настоящее время, и я получаю сообщение об ошибке в строке 19 (Это комментируется). Моя ошибка говорит «error CS1001: Identifier Expected« Я не мог понять, что это значит. Любая помощь?

using System; 
using Microsoft.Win32; 
using System.Data; 

public class regTest 
{ 
    public static void Main() 
    { 
     try 
     { 
      RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\\Wow6432Node\\MySQL AB\\MySQL Connector\\Net"); 
      if (key != null) 
      { 
       Object o = key.GetValue("Version"); 
       if (o != null) 
       { 
        Version version = new Version(o as String); //"as" because it's REG_SZ...otherwise ToString() might be safe(r) 
        Version broken = new Version("6.7.4"); 
        if (version.Equals.(broken)) //This is where the error is occuring 
        { 
         DataSet dataSet = ConfigurationManager.GetSection("system.data") as ystem.Data.DataSet; 

         DataView vi = dataSet.Tables[0].DefaultView; 
         vi.Sort = "Name"; 
         if (vi.Find("MySql") == -1) 
         { 
          dataSet.Tables[0].Rows.Add("MySql" 
           , "MySql.Data.MySqlClient" 
           , "MySql.Data.MySqlClient" 
           , 
           typeof(MySql.Data.MySqlClient.MySqlClientFactory).AssemblyQualifiedName); 
         } 

        } 

       } 
      } 
     } 

     catch (Exception ex) //just for demonstration...it's always best to handle specific exceptions 
     { 
      //react appropriately 
     } 
    } 
} 
+1

http://msdn.microsoft.com/en-us/library/microsoft.win32.registry.getvalue.aspx – Marcus

ответ

56

Прежде всего, вы должны добавить using Microsoft.Win32; на свою кодовую страницу.

Затем вы можете начать использовать Registry классы:

try 
{ 
    using (RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\\Wow6432Node\\MySQL AB\\MySQL Connector\\Net")) 
    { 
     if (key != null) 
     { 
      Object o = key.GetValue("Version"); 
      if (o != null) 
      { 
       Version version = new Version(o as String); //"as" because it's REG_SZ...otherwise ToString() might be safe(r) 
       //do what you like with version 
      } 
     } 
    } 
} 
catch (Exception ex) //just for demonstration...it's always best to handle specific exceptions 
{ 
    //react appropriately 
} 

BEWARE:, если у вас нет доступа администратора, вы вряд ли сможете многое сделать в LOCAL_MACHINE. Иногда даже чтение значений может быть подозрительной операцией без прав администратора.

+0

Я обновил свой код, чтобы отразить то, что вы мне предоставили, но я столкнулся с проблемой, как показано выше. , любая помощь? – Scalahansolo

+0

Выньте лишний '.' – DonBoitnott

+6

В рамках использования блоков следует использовать «RegistryKey». Они реализуют IDisposable. –