2013-08-14 19 views
30

All'avvio della mia applicazione sto provando a vedere se l'utente ha una versione specifica di un software installato, in particolare il connettore MySQL, utilizzando tutti C#. Nel registro, MySQL contiene una voce di versione. Quindi quello che sto cercando di realizzare è questo.Come leggere il valore di una chiave di registro C#

La mia app si avvia. Da qualche parte nel codice di avvio ho bisogno di fare le seguenti cose in ordine. Controllare per vedere se l'utente ha il connettore di MySQL installata, che si trova a ...

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

Se l'utente ha installato il connettore, ho voluto verificare quale versione che hanno, che è memorizzato come Nome = "Versione" e Dati = xxx (Immagine sotto)

Ora se l'utente ha una versione specifica installata, eseguirò altro codice, da cui posso prelevare.

Quale sarebbe il modo migliore per farlo?

enter image description here

EDIT: Di seguito è il codice che attualmente ho e sto ottenendo un errore sulla linea 19 (Si è commentato). Il mio errore dice "error CS1001: Identifier Expected" Non ero in grado di capire cosa significa. Qualsiasi aiuto?

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

risposta

56

È necessario prima aggiungere using Microsoft.Win32; alla tabella codici.

Poi si può iniziare a utilizzare le classi 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 
} 

attenzione: se non si ha accesso come amministratore, e 'difficile essere in grado di fare molto in LOCAL_MACHINE. A volte anche la lettura dei valori può essere un'operazione sospetta senza diritti di amministratore.

+0

Ho aggiornato il mio codice per riflettere ciò che mi hai fornito, ma ho riscontrato un problema come mostrato sopra , qualsiasi aiuto? – Scalahansolo

+0

Elimina l'extra "." – DonBoitnott

+6

Si dovrebbe usare "RegistryKey" all'interno dei blocchi. Implementano IDisposable. –

Problemi correlati