如何使用C#以编程方式检查jre环境是32位还是64位?

如何使用C#以编程方式检查jre环境是32位还是64位?,c#,java,jvm-hotspot,jvm-crash,C#,Java,Jvm Hotspot,Jvm Crash,我有一个基本上是java运行时的jre文件夹,它没有安装。我从其他地方复制了这个文件夹,现在我需要在不编写任何代码的情况下手动检查这个jre是32位还是64位,如果必须编写代码,那么它应该是c。 所有的示例都告诉system.getproperty(“java…model”)一些获取已安装jre的目标类型的信息,但是我没有安装这个jre,而是复制了这个jre。 那么有没有办法知道它的目标类型是32位还是64位。C#Code // *** Main code string output = Run

我有一个基本上是java运行时的jre文件夹,它没有安装。我从其他地方复制了这个文件夹,现在我需要在不编写任何代码的情况下手动检查这个jre是32位还是64位,如果必须编写代码,那么它应该是c。 所有的示例都告诉system.getproperty(“java…model”)一些获取已安装jre的目标类型的信息,但是我没有安装这个jre,而是复制了这个jre。 那么有没有办法知道它的目标类型是32位还是64位。

C#Code

// *** Main code
string output = RunExternalExe("java.exe -version");

// Parse output here...


// *** Helper methods
public string RunExternalExe(string filename, string arguments = null)
{
    var process = new Process();

    process.StartInfo.FileName = filename;
    if (!string.IsNullOrEmpty(arguments))
    {
        process.StartInfo.Arguments = arguments;
    }

    process.StartInfo.CreateNoWindow = true;
    process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    process.StartInfo.UseShellExecute = false;

    process.StartInfo.RedirectStandardError = true;
    process.StartInfo.RedirectStandardOutput = true;
    var stdOutput = new StringBuilder();
    process.OutputDataReceived += (sender, args) => stdOutput.Append(args.Data);

    string stdError = null;
    try
    {
        process.Start();
        process.BeginOutputReadLine();
        stdError = process.StandardError.ReadToEnd();
        process.WaitForExit();
    }
    catch (Exception e)
    {
        throw new Exception("OS error while executing " + Format(filename, arguments)+ ": " + e.Message, e);
    }

    if (process.ExitCode == 0)
    {
        return stdOutput.ToString();
    }
    else
    {
        var message = new StringBuilder();

        if (!string.IsNullOrEmpty(stdError))
        {
            message.AppendLine(stdError);
        }

        if (stdOutput.Length != 0)
        {
            message.AppendLine("Std output:");
            message.AppendLine(stdOutput.ToString());
        }

        throw new Exception(Format(filename, arguments) + " finished with exit code = " + process.ExitCode + ": " + message);
    }
}

private string Format(string filename, string arguments)
{
    return "'" + filename + 
        ((string.IsNullOrEmpty(arguments)) ? string.Empty : " " + arguments) +
        "'";
}

命令样本输出
在我的盒子上,我有一个64位的java版本。以下是它的输出:

C:\Program Files\Java\jdk1.7.0_45\bin>java -version java version "1.7.0_45" Java(TM) SE Runtime Environment (build 1.7.0_45-b18) Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode) C:\ProgramFiles\Java\jdk1.7.0\u 45\bin>Java-version java版本“1.7.0_45” Java(TM)SE运行时环境(build 1.7.0_45-b18) Java HotSpot(TM)64位服务器虚拟机(构建24.45-b08,混合模式)
请注意64位代码。您可能会发现这很有用。

您可以使用GNU
文件
实用程序来检查java.exe是否为64位可执行文件

有关详细信息,请参阅


这样,您可以避免从代码中启动未知的java.exe,但您的程序必须启动您自己提供的
文件
实用程序。

我知道我做得晚了,但我用C编写了这些方法,这样它就可以检测32/64位JRE和JDK,因为提供的答案不能满足我的需要

private string CheckJreJdkVersion()
{
    StringBuilder sb = new StringBuilder();

    string jre = @"SOFTWARE\JavaSoft\Java Runtime Environment";
    string jdk = @"SOFTWARE\JavaSoft\Java Development Kit";
    string jreInstallDirValueName = "INSTALLDIR";
    string jdkInstallDirValueName = "JavaHome";
    // Check 32-bit JRE
    GetJreJdkVersion(jre, RegistryView.Registry32, jreInstallDirValueName, ref sb, "JRE", "32");
    // Check 64-bit JRE
    GetJreJdkVersion(jre, RegistryView.Registry64, jreInstallDirValueName, ref sb, "JRE", "64");
    // Check 32-bit JDK
    GetJreJdkVersion(jdk, RegistryView.Registry32, jdkInstallDirValueName, ref sb, "JDK", "32");
    // Check 64-bit JDK
    GetJreJdkVersion(jdk, RegistryView.Registry64, jdkInstallDirValueName, ref sb, "JDK", "64");

    string res = sb.ToString();
    return res;
}

private void GetJreJdkVersion(string jreJdkPath, RegistryView registryView, string jreJdkInstallDirValueName, ref StringBuilder sb, string jreJdk, string bitVer)
{
    RegistryKey key = GetRegistryKeyHKLM(jreJdkPath, registryView);
    if (key == null)
        return;

    List<string> lstVersions = new List<string>();
    foreach (var version in key.GetSubKeyNames())
    {
        lstVersions.Add(version);
    }

    IEnumerable<string> relevantVersions = GetRelevantVersions(lstVersions);

    foreach (var relevantVersion in relevantVersions)
    {
        string regPath = string.Empty;
        if (jreJdk == "JRE")
        {
            regPath = Path.Combine(jreJdkPath, Path.Combine(relevantVersion, "MSI"));
        }
        else
        {
            regPath = Path.Combine(jreJdkPath, relevantVersion);
        }

        string installDir = GetRegistryValueHKLM(regPath, jreJdkInstallDirValueName, registryView);

        sb.Append("Detected " + bitVer + "-bit " + jreJdk + ", install directory: " + installDir + "\n");
    }
}

private IEnumerable<string> GetRelevantVersions(List<string> lstVersions)
{
    IEnumerable<string> versions = lstVersions.Where(version => version.Contains("_"));

    return versions;
}

public RegistryKey GetRegistryKeyHKLM(string keyPath, RegistryView view)
{
    RegistryKey localMachineRegistry
        = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, view);

    return string.IsNullOrEmpty(keyPath)
        ? localMachineRegistry
        : localMachineRegistry.OpenSubKey(keyPath);
}

public string GetRegistryValueHKLM(string keyPath, string keyName, RegistryView view)
{
    RegistryKey registry = GetRegistryKeyHKLM(keyPath, view);
    if (registry == null) return null;

    string value = string.Empty;
    try
    {
        value = registry.GetValue(keyName).ToString();
    }
    catch (Exception)
    {

    }
    return value;
}

即使没有安装,bin文件夹中的java可执行文件也会对
java-version
作出反应。检查复制它的系统上的版本(32 vs 64)。因此,如果我在CMD中键入java.exe-version,我可以看到输出。但是如果我运行您编写的代码,我会得到一个异常,说找不到java.exe。直接运行CMD和Process.Start有区别吗?@Hoky22检查您的机器上是否安装了java。如果是,请在PATH环境变量中检查它是否可访问。最后检查,编辑代码并将绝对路径添加到java.exe。java已安装,并在path环境变量中设置。我尽量不硬编码绝对路径,但就我而言,它在C:\ProgramData\Oracle\Java\javapath中,我想您可以在其他地方安装它
Detected 32-bit JRE, install directory: C:\Program Files (x86)\Java\jre7\
Detected 32-bit JRE, install directory: C:\Program Files (x86)\Java\jre1.8.0_73\
Detected 32-bit JRE, install directory: C:\New folder\
Detected 64-bit JRE, install directory: C:\Program Files\Java\jre7\
Detected 32-bit JDK, install directory: C:\jdk fol