C# Windows注册表项检查在C中失败#

C# Windows注册表项检查在C中失败#,c#,.net,registry,C#,.net,Registry,我正在进行java安装+版本检查,但安装检查失败 我尝试更改JavaKey,当我添加一个包含空格的密钥时,它失败并返回false bool checkIfJavaInstalled() { string JavaKey=“SOFTWARE\\JavaSoft\\Java运行时环境\\”; bool installed=Microsoft.Win32.Registry.LocalMachine.OpenSubKey(JavaKey)==null; 返回安装; } 我希望结果是true,但它返回f

我正在进行java安装+版本检查,但安装检查失败

我尝试更改
JavaKey
,当我添加一个包含空格的密钥时,它失败并返回false

bool checkIfJavaInstalled()
{
string JavaKey=“SOFTWARE\\JavaSoft\\Java运行时环境\\”;
bool installed=Microsoft.Win32.Registry.LocalMachine.OpenSubKey(JavaKey)==null;
返回安装;
}

我希望结果是
true
,但它返回
false

看起来您在检查错误的东西。您询问该路径上的注册表项是否为空,如果为空,则安装Java。我相信您希望检查密钥是否不为null。如果它们的注册表项不为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();
  }
}

对于Java检查,我使用以下代码
is64
指定要检查的注册表。目前我调用了
CheckJavaIsInstalled
两次:)

private static bool CheckJavaIsInstalled(TaskLoggingHelper日志,bool为64){
试一试{
使用(var rk=RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine,is64?RegistryView.Registry64:RegistryView.Registry32)){
使用(var subKey=rk.OpenSubKey(“软件\\JavaSoft\\Java运行时环境”)){
if(子键==null)
返回false;
字符串currentVerion=subKey.GetValue(“CurrentVersion”).ToString();
浮动版本;
if(float.TryParse(currentVerion,System.Globalization.NumberStyles.float,System.Globalization.CultureInfo.InvariantCulture,out版本)){
if(版本<1.8f)
LogMessage(MessageImportance.High,“早于1.8的Java版本{0}”,version);
}
其他的
LogMessage(MessageImportance.High,“解析Java版本{0}失败”,currentVerion);
}
}
}
捕获(例外情况除外){
LogError(“Java检查失败”);
log.LogErrorFromException(ex);
返回false;
}
返回true;
}

我把它修好了。基本上是建筑把事情搞砸了

旧代码:

bool checkIfJavaInstalled()
{
string JavaKey=“SOFTWARE\\JavaSoft\\Java运行时环境\\”;
bool installed=Microsoft.Win32.Registry.LocalMachine.OpenSubKey(JavaKey)==null;
返回安装;
}
新代码:

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运行时环境\\”;
bool installed=Microsoft.Win32.RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine,regview)。OpenSubKey(JavaKey)!=null;
返回安装;
}

我知道我可以将
key==null
更改为
key!=空
但这不是我想要的。
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;
}