如何检查C#中是否安装了软件?

时间:2011-12-01 14:18:05

标签: c# windows visual-studio-2010

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()中的String keyName处压缩,Object引用未设置为对象的实例。任何人告诉我的原因是什么,

2 个答案:

答案 0 :(得分:4)

我认为问题可能在这里:

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

答案 1 :(得分:1)

错误表示OpenSubKey返回了null(当您尝试访问设置为NullReferenceException的变量的成员时,您获得了null。这反过来意味着您要查找的注册表项不存在。

在尝试使用null对象之前添加key检查。

key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
if(key != null)
{
    foreach (String keyName in key.GetSubKeyNames())
    {
      // .... 
    }
}