【问题标题】:How can I get another application's installation path programmatically?如何以编程方式获取另一个应用程序的安装路径?
【发布时间】:2011-04-24 10:07:24
【问题描述】:

我想知道应用程序的安装路径在哪里。我知道它通常位于 ...\Program Files... 但我猜有些人将它安装在不同的位置。我知道应用程序的名称。

谢谢。

【问题讨论】:

标签: c# windows path installation


【解决方案1】:

查找程序安装路径(在 Windows 上)的理想方法是从注册表中读取它。大多数安装程序将为该程序创建一个包含安装路径的注册表项。该密钥的确切位置和名称取决于所讨论的程序。

要查找程序是否在注册表中有键,请打开“regedit”并使用“编辑”>“查找”选项尝试查找具有程序名称的键。如果存在这样的密钥,您可以使用 .NET Framework 库中的 RegistryKey 类来读取它。

如果程序没有注册表项,那么另一种选择就是要求用户使用 OpenFileDialog 定位 .exe 文件,尽管这显然不理想。

【讨论】:

    【解决方案2】:

    许多(大多数?)程序会创建一个App Paths 注册表项。来看看

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
    

    【讨论】:

      【解决方案3】:

      如果您知道有问题的应用程序(与任何应用程序相比),注册表项可能是最好的选择(如果存在的话)。

      安装可能会在某处放置自己的自定义“安装路径密钥”(如 Fara 提到的那样进行查找),或者它可能位于已安装程序的卸载部分,因此您可以检查:

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

      但请注意,任何新版本的安装都可能更改它写出的密钥,无论是自定义密钥还是卸载条目。所以检查注册表可能应该只针对已知的安装\版本。

      【讨论】:

        【解决方案4】:

        最好的方法是使用安装程序 API 来查找程序位置。 您可以在 API 上编写托管包装器

        搜索 MsiGetProductInfo

        参考:http://msdn.microsoft.com/en-us/library/aa369558(VS.85).aspx

        【讨论】:

          【解决方案5】:

          您可以使用 MSI(我在这里为它编写了一个 C# 包装器 https://github.com/alialavia/MSINet)。这是一个简单的例子:

          var location = "";
          foreach (var p in InstalledProduct.Enumerate())
          {
              try
              {
                  if (p.InstalledProductName.Contains("AppName"))                     
                  {
                      location = p.InstallLocation;
                      break;
                  }
              } 
              catch { }
          }
          

          【讨论】:

            【解决方案6】:

            查看注册表。

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

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

            上面的每一个都包含一个子键列表,每个已安装的应用程序都有一个(例如,在“程序和功能”小程序中显示的那样)

            您可以在那里搜索您的应用程序,或者如果您知道产品代码,请直接访问它。

                public string GetInstallPath(string applicationName)
                {
                    var installPath = FindApplicationPath(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", applicationName);
            
                    if (installPath == null)
                    {
                        installPath = FindApplicationPath(@"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall", applicationName);
                    }
            
                    return installPath;
                }
            
                private string FindApplicationPath(string keyPath, string applicationName)
                {
            
                    var hklm = Registry.LocalMachine;
                    var uninstall = hklm.OpenSubKey(keyPath);
                    foreach (var productSubKey in uninstall.GetSubKeyNames())
                    {
                        var product = uninstall.OpenSubKey(productSubKey);
            
                        var displayName = product.GetValue("DisplayName");
                        if (displayName != null && displayName.ToString() == applicationName)
                        {
                            return product.GetValue("InstallLocation").ToString();
                        }
            
                    }
            
                    return null;
                }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多