【发布时间】:2011-04-24 10:07:24
【问题描述】:
我想知道应用程序的安装路径在哪里。我知道它通常位于 ...\Program Files... 但我猜有些人将它安装在不同的位置。我知道应用程序的名称。
谢谢。
【问题讨论】:
标签: c# windows path installation
我想知道应用程序的安装路径在哪里。我知道它通常位于 ...\Program Files... 但我猜有些人将它安装在不同的位置。我知道应用程序的名称。
谢谢。
【问题讨论】:
标签: c# windows path installation
查找程序安装路径(在 Windows 上)的理想方法是从注册表中读取它。大多数安装程序将为该程序创建一个包含安装路径的注册表项。该密钥的确切位置和名称取决于所讨论的程序。
要查找程序是否在注册表中有键,请打开“regedit”并使用“编辑”>“查找”选项尝试查找具有程序名称的键。如果存在这样的密钥,您可以使用 .NET Framework 库中的 RegistryKey 类来读取它。
如果程序没有注册表项,那么另一种选择就是要求用户使用 OpenFileDialog 定位 .exe 文件,尽管这显然不理想。
【讨论】:
许多(大多数?)程序会创建一个App Paths 注册表项。来看看
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
【讨论】:
如果您知道有问题的应用程序(与任何应用程序相比),注册表项可能是最好的选择(如果存在的话)。
安装可能会在某处放置自己的自定义“安装路径密钥”(如 Fara 提到的那样进行查找),或者它可能位于已安装程序的卸载部分,因此您可以检查:
但请注意,任何新版本的安装都可能更改它写出的密钥,无论是自定义密钥还是卸载条目。所以检查注册表可能应该只针对已知的安装\版本。
步
【讨论】:
最好的方法是使用安装程序 API 来查找程序位置。 您可以在 API 上编写托管包装器
搜索 MsiGetProductInfo
参考:http://msdn.microsoft.com/en-us/library/aa369558(VS.85).aspx
【讨论】:
您可以使用 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 { }
}
【讨论】:
查看注册表。
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;
}
【讨论】: