Сбой проверки ключа реестра Windows в C # - PullRequest
1 голос
/ 28 мая 2019

Я выполняю установку Java + проверку версии, но проверка установки не удалась.

Я попытался изменить JavaKey, и когда я добавил ключ с пробелом, он завершился ошибкой и вернул false.

        bool checkIfJavaInstalled()
        {
            string JavaKey = "SOFTWARE\\JavaSoft\\Java Runtime Environment\\";
            bool installed = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(JavaKey) == null;
            return installed;
        }

Я ожидаю, что результат будет true, но он вернет false.

Ответы [ 3 ]

1 голос
/ 28 мая 2019

Я исправил это. Это была в основном архитектура, запутывающая вещи.

Старый код:

bool checkIfJavaInstalled()
{
    string JavaKey = "SOFTWARE\\JavaSoft\\Java Runtime Environment\\";
    bool installed = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(JavaKey) == null;
    return installed;
}

Новый код:

bool checkIfJavaInstalled()
{
    var regview = Microsoft.Win32.RegistryView.Registry64;
    if (string.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432")))
    {
        regview = Microsoft.Win32.RegistryView.Registry32;
    }
    string JavaKey = "SOFTWARE\\JavaSoft\\Java Runtime Environment\\";
    bool installed = Microsoft.Win32.RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, regview).OpenSubKey(JavaKey) != null;
    return installed;
}
0 голосов
/ 28 мая 2019

Для проверки Java я использую этот код. is64, чтобы указать, какой реестр я хочу проверить. В настоящее время я звоню CheckJavaIsInstalled два раза:)

public static bool CheckJavaIsInstalled(TaskLoggingHelper log) {
  if (CheckJavaIsInstalled(log, false) || CheckJavaIsInstalled(log, true))
    return true;

...

private static bool CheckJavaIsInstalled(TaskLoggingHelper log, bool is64) {

  try {
    using (var rk = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, is64 ? RegistryView.Registry64 : RegistryView.Registry32)) {
      using (var subKey = rk.OpenSubKey("SOFTWARE\\JavaSoft\\Java Runtime Environment")) {
        if (subKey == null)
          return false;
        string currentVerion = subKey.GetValue("CurrentVersion").ToString();
        float version;
        if (float.TryParse(currentVerion, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out version)) {
          if (version < 1.8f)
            log.LogMessage(MessageImportance.High, "Java version {0} older than 1.8", version);
        }
        else
          log.LogMessage(MessageImportance.High, "Failed parse Java version {0} ", currentVerion);

      }
    }
  }
  catch (Exception ex) {
    log.LogError("Java check failed");
    log.LogErrorFromException(ex);
    return false;
  }
  return true;
}
0 голосов
/ 28 мая 2019

похоже, вы проверяете не то. Вы спрашиваете, является ли ключ реестра по этому пути нулевым, и если это так, то Java установлена. Я считаю, что вы хотите проверить, что ключ не null. Если они имеют ключ , а не ноль, то ключ реестра Java найден, и, следовательно, Java установлена.

Кроме того, я хочу упомянуть, что вам необходимо утилизировать промежуточный ключ в том случае, если он найден. Итак, ваш код должен выглядеть так:

RegistryKey key = null;
try
{
  key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\JavaSoft\\Java Runtime Environment\\");
  if (key != null)
  {
    return true;
  }
}
finally
{
  if (key != null)
  {
    key.Dispose();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...