如何检查软件是否安装在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#中?

+0

也许键不存在? – ChrisBint

+0

除此之外,如果事情已经gobe可怕的错误,卸载键是否存在等,并不意味着它的安装... –

+2

请永远不要硬编码'Wow6432Node'到应用程序中。如果您的目标是.net 4,则可以使用RegistryView'枚举打开注册表的32位或64位视图。 –

的错误意味着OpenSubKey返回null(你得到一个NullReferenceException当您试图访问一个变量组的成员null)。这反过来意味着您正在查找的注册表项不存在。

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

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

我尝试了,我跑我的代码,我已经安装Skype,但这种方法始终返回false – Desire

+0

@Aqib:什么我知道,不是每一个软件,你的注册表中的一部分安装场所的关键...... – Marco

+0

你问关于错误,尽管你的标题与你的问题不同。从注册表中读取时,需要确保运行该程序的帐户有权从注册表中读取。 – Oded

我想这个问题可能是在这里:

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(如果不存在)。