기본적으로 자바 런타임 인 jre 폴더가 있습니다. 설치되어 있지 않습니다.이 폴더를 다른 곳에서 복사 했으므로 이제이 jre가 32 비트인지 64 비트인지를 수동 검사로 확인해야합니다. 코드가 있으면 그러면 C#이어야합니다. 모든 예에서는 설치된 jre의 대상 유형을 가져 오는 데 system.getproperty ("java ... model")를 지정하지만이 jre가 설치되어 있지 않습니다.이 jre가 복사되었습니다. 32 비트 또는 64 비트이므로 대상 유형을 알 수있는 방법이 있습니다.jre 환경이 32 비트인지 64 비트인지를 C#으로 프로그래밍 방식으로 확인하는 방법은 무엇입니까?
답변
내 상자에서
// *** 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) +
"'";
}
명령의 샘플 출력
C# 코드 나 64 비트 자바 버전이있다.
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)
참고 64 비트 언급 : 여기에 출력한다. 이 SO answer이 유용 할 수 있습니다.
그래서 CMD에 java.exe -version을 입력하면 출력을 볼 수 있습니다. 하지만 작성한 코드를 실행하면 java.exe가 발견되지 않는다는 예외가 발생합니다. CMD를 직접 실행하고 Process.Start를 실행하는 차이점이 있습니까? – HoKy22
@ Hoky22 Check java가 상자에 설치되어 있는지 확인하십시오. 그렇다면 PATH environement 변수에서 액세스 할 수 있는지 확인하십시오. 마지막으로 코드를 편집하고 java.exe의 절대 경로를 추가하십시오. – Stephan
Java가 설치되어 있으며 Path 환경 변수에 설정되어 있습니다. 나는 절대 경로를 하드 코딩하지 않으려 고 노력하고있다. 내 경우에는 C : \ ProgramData \ Oracle \ Java \ javapath에있다. 다른 위치에 설치할 수 있다고 생각한다. – HoKy22
java.exe가 64 비트 실행 파일인지 여부를 확인하려면 GNU file
유틸리티를 사용할 수 있습니다.
자세한 내용은 this link을 참조하십시오.
이렇게하면 알 수없는 java.exe가 코드에서 시작되는 것을 피할 수 있지만 대신 프로그램에서 file
유틸리티를 시작해야합니다.
나는이 늦게 나는 알고 있지만, 제공된 답변을 내 필요 충분하지 않기 때문에 나는 64분의 32 비트 JRE와 JDK를 모두 검색 할 수 있도록 C#에서 이러한 방법을 썼다
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 폴더에있는 자바 실행 파일은`자바 -version`에 반응해야 설치되지 않은 경우에도
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
(64 대 32) ... – WarrenFaith
확인 버전은했습니다 시스템 그것을에서 복사했습니다. –