如何检查软件是否安装在C#中?
问题描述:
public static bool IsApplictionInstalled(string p_name)
{
string displayName;
RegistryKey key;
// search in: CurrentUser
key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (String keyName in key.GetSubKeyNames())
{
RegistryKey subkey = key.OpenSubKey(keyName);
displayName = subkey.GetValue("DisplayName") as string;
if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
{
return true;
}
}
// search in: LocalMachine_32
key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (String keyName in key.GetSubKeyNames())
{
RegistryKey subkey = key.OpenSubKey(keyName);
displayName = subkey.GetValue("DisplayName") as string;
if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
{
return true;
}
}
// search in: LocalMachine_64
key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (String keyName in key.GetSubKeyNames())
{
RegistryKey subkey = key.OpenSubKey(keyName);
displayName = subkey.GetValue("DisplayName") as string;
if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
{
return true;
}
}
// NOT FOUND
return false;
}
该方法检查32位或64位Win OS中的软件,但其无法正常工作,在key.GetSubKeyNames()中的字符串keyName处粉碎,未将对象引用设置为对象的实例。任何一个可以告诉我是什么原因,如何检查软件是否安装在C#中?
答
的错误意味着OpenSubKey
返回null
(你得到一个NullReferenceException
当您试图访问一个变量组的成员null
)。这反过来意味着您正在查找的注册表项不存在。
尝试使用key
对象之前添加null
检查。
key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
if(key != null)
{
foreach (String keyName in key.GetSubKeyNames())
{
// ....
}
}
答
我想这个问题可能是在这里:
key = Registry.LocalMachine.OpenSubKey(
@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (String keyName in key.GetSubKeyNames())
该键不存在32位。
所以,你应该使用(每一个键就检查)
key = ....
if (key != null)
{
foreach (String keyName in key.GetSubKeyNames())
// ....
}
另一种信息:你会注意到一些(很多?)注册表项不包含displayName
价值,所以你的比较可能会失败。尝试(仅举例)使用密钥名称代替displayName
(如果不存在)。
也许键不存在? – ChrisBint
除此之外,如果事情已经gobe可怕的错误,卸载键是否存在等,并不意味着它的安装... –
请永远不要硬编码'Wow6432Node'到应用程序中。如果您的目标是.net 4,则可以使用RegistryView'枚举打开注册表的32位或64位视图。 –