2009-09-22 24 views
18

Como sugirió here, necesito iterar a través de entradas eniterar a través de las entradas del registro

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ 

para averiguar la ruta instalada de mi solicitud. Cómo iterar para poder averiguar el valor InstallLocation dado el DisplayName. Cómo hacerlo de manera eficiente en C#.

+1

Tenga en cuenta que para acceder a HKEY_LOCAL_MACHINE su aplicación debe tener privilegios de administrador (para todos los sistemas operativos después de XP). Me pregunto si la pregunta debería ser '¿cómo encontrar la ruta de acceso instalada de mi aplicación'? Si el escenario es para actualizaciones, etc., creo que los datos de aplicaciones comunes pueden ser mejores. –

Respuesta

26

A continuación se muestra el código para lograr su objetivo:

class Program 
{ 
    static void Main(string[] args) 
    { 
     RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall"); 
     foreach (var v in key.GetSubKeyNames()) 
     { 
      Console.WriteLine(v); 

      RegistryKey productKey = key.OpenSubKey(v); 
      if (productKey != null) 
      { 
       foreach (var value in productKey.GetValueNames()) 
       { 
        Console.WriteLine("\tValue:" + value); 

        // Check for the publisher to ensure it's our product 
        string keyValue = Convert.ToString(productKey.GetValue("Publisher")); 
        if (!keyValue.Equals("MyPublisherCompanyName", StringComparison.OrdinalIgnoreCase)) 
         continue; 

        string productName = Convert.ToString(productKey.GetValue("DisplayName")); 
        if (!productName.Equals("MyProductName", StringComparison.OrdinalIgnoreCase)) 
         return; 

        string uninstallPath = Convert.ToString(productKey.GetValue("InstallSource")); 

        // Do something with this valuable information 
       } 
      } 
     } 

     Console.ReadLine(); 
    } 
} 

Editar: Ver this method for a more comprehensive way to find an Applications Install Path, se demuestra la using disponer como se sugiere en los comentarios. https://stackoverflow.com/a/26686738/495455

+2

Es posible que desee llamar a 'Dispose' en las instancias' RegistryKey' o, mejor aún, envolverlas en bloques 'using'. –

+0

Nota: Deberá realizar un envío a un IDisposable para deshacerse de él de manera explícita. – xr280xr

Cuestiones relacionadas