2013-12-19 3 views
1

기본적으로 자바 런타임 인 ​​jre 폴더가 있습니다. 설치되어 있지 않습니다.이 폴더를 다른 곳에서 복사 했으므로 이제이 jre가 32 비트인지 64 비트인지를 수동 검사로 확인해야합니다. 코드가 있으면 그러면 C#이어야합니다. 모든 예에서는 설치된 jre의 대상 유형을 가져 오는 데 system.getproperty ("java ... model")를 지정하지만이 jre가 설치되어 있지 않습니다.이 jre가 복사되었습니다. 32 비트 또는 64 비트이므로 대상 유형을 알 수있는 방법이 있습니다.jre 환경이 32 비트인지 64 비트인지를 C#으로 프로그래밍 방식으로 확인하는 방법은 무엇입니까?

+3

(64 대 32) ... – WarrenFaith

+0

확인 버전은했습니다 시스템 그것을에서 복사했습니다. –

답변

1

내 상자에서

// *** 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이 유용 할 수 있습니다.

+0

그래서 CMD에 java.exe -version을 입력하면 출력을 볼 수 있습니다. 하지만 작성한 코드를 실행하면 java.exe가 발견되지 않는다는 예외가 발생합니다. CMD를 직접 실행하고 Process.Start를 실행하는 차이점이 있습니까? – HoKy22

+0

@ Hoky22 Check java가 상자에 설치되어 있는지 확인하십시오. 그렇다면 PATH environement 변수에서 액세스 할 수 있는지 확인하십시오. 마지막으로 코드를 편집하고 java.exe의 절대 경로를 추가하십시오. – Stephan

+0

Java가 설치되어 있으며 Path 환경 변수에 설정되어 있습니다. 나는 절대 경로를 하드 코딩하지 않으려 고 노력하고있다. 내 경우에는 C : \ ProgramData \ Oracle \ Java \ javapath에있다. 다른 위치에 설치할 수 있다고 생각한다. – HoKy22

0

java.exe가 64 비트 실행 파일인지 여부를 확인하려면 GNU file 유틸리티를 사용할 수 있습니다.

자세한 내용은 this link을 참조하십시오.

이렇게하면 알 수없는 java.exe가 코드에서 시작되는 것을 피할 수 있지만 대신 프로그램에서 file 유틸리티를 시작해야합니다.

0

나는이 늦게 나는 알고 있지만, 제공된 답변을 내 필요 충분하지 않기 때문에 나는 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