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