Я использую код из этого сообщения Проверить, установлено ли приложение в реестре , чтобы проверить, есть ли указанная программа в реестре:
public static bool CheckInstalled(string c_name, string c_added = null)
{
string displayName;
string registryKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
RegistryKey key = Registry.LocalMachine.OpenSubKey(registryKey);
if (key != null)
{
foreach (RegistryKey subkey in key.GetSubKeyNames().Select(keyName => key.OpenSubKey(keyName)))
{
displayName = subkey.GetValue("DisplayName") as string;
if (displayName != null && ((displayName.ToLower() == c_name.ToLower() && c_added == null) || (c_added != null && (displayName.ToLower().Contains(c_name.ToLower()) && displayName != null && displayName.ToLower().Contains(c_added.ToLower())))))
{
return true;
}
}
key.Close();
}
registryKey = @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall";
key = Registry.LocalMachine.OpenSubKey(registryKey);
if (key != null)
{
foreach (RegistryKey subkey in key.GetSubKeyNames().Select(keyName => key.OpenSubKey(keyName)))
{
displayName = subkey.GetValue("DisplayName") as string;
if (displayName != null && ((displayName.ToLower() == c_name.ToLower() && c_added == null) || (c_added != null && (displayName.ToLower().Contains(c_name.ToLower()) && displayName != null && displayName.ToLower().Contains(c_added.ToLower())))))
{
return true;
}
}
key.Close();
}
return false;
}
И это не может найти "Microsoft SQL Server 2019 ", который существует, когда я go по пути:
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\
Я добавил
var list = key.GetSubKeyNames().Select(keyName => key.OpenSubKey(keyName).GetValue("DisplayName")).ToList();
после
if (key != null)
, и это возвращает count = 205 , в то время как при запуске regedit я вижу ~ 120.
Я могу добавить, что есть несколько экземпляров с отображаемым именем «Microsoft SQL Server», и он их не находит. Когда я установил SQL Server 2017, таких проблем не было.
РЕДАКТИРОВАТЬ:
Проблема в том, что, несмотря на указание путь для 32 бит и 64 бит. По этому пути дважды проверяется, в какой конфигурации программа была запущена. Для параметра Any Cpu это x32.