2009-09-22 23 views
18

Wie vorgeschlagen here, ich brauche inIterate durch Registrierungseinträge

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

durch Einträge iterieren den installierten Pfad meiner Anwendung zu erfahren. Wie man iteriert, so dass ich den InstallLocation Wert herausfinden kann, der DisplayName gegeben wird. Wie man es effizient in C# macht.

+1

Beachten Sie, dass für den Zugriff auf HKEY_LOCAL_MACHINE Ihre Anwendung über Administratorrechte verfügen muss (für alle Betriebssysteme nach XP). Ich frage mich, ob die Frage "Wie finde ich den installierten Pfad meiner Anwendung" lautet? Wenn das Szenario für Upgrades usw. gedacht ist, denke ich, dass allgemeine Anwendungsdaten besser gehen können. –

Antwort

26

Below-Code ist Ihr Ziel zu erreichen:

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(); 
    } 
} 

Edit: Siehe this method for a more comprehensive way to find an Applications Install Path, es zeigt die using in den Kommentaren, wie vorgeschlagen zu entsorgen. https://stackoverflow.com/a/26686738/495455

+2

Sie können 'Dispose' auf den 'RegistryKey'-Instanzen aufrufen, oder, besser noch, sie in' using'-Blöcke umbrechen. –

+0

Hinweis: Sie müssen zuerst zu einem IDisposable umwandeln, um explizit zu disponentieren. – xr280xr