0

プロセスを使用して、「-version」コマンドラインパラメータを使用してインストールされたJavaのバージョンを確認しようとしています。ただし、Javaアプリケーションから出力されたコマンドラインを読み取ろうとすると、null値が返されます。

私のコードはかなり単純です:

Process java = new Process();
java.StartInfo.RedirectStandardOutput = true;
java.StartInfo.CreateNoWindow = true;
java.StartInfo.UseShellExecute = false;
java.StartInfo.FileName = "java";
java.StartInfo.Arguments = "-version";
java.Start();

// version comes out null
string version = java.StandardOutput.ReadLine();

// There are probably better ways to extract this data but
// I want to get it working before I cross that bridge.
string versionNumber = version.Substring(16, 1);
hasJava = int.Parse(versionNumber) < 7;

java.Close();

小さくて簡単なものかもしれませんが、見えません。

4

3 に答える 3

1

現在インストールされているJavaバージョンをレジストリから読み取ることもできます。次のファイルには、TryGetJavaHome特定のベンダー/インストールの組み合わせに対して32ビットおよび64ビットの仮想マシンをサポートするメソッドが含まれています。

bool TryGetJavaHome(
    RegistryView registryView,
    string vendor,
    string installation,
    out string javaHome)

ベンダー:

  • 「JavaSoft」(HotSpot)
  • 「JRockit」

インストール:

  • "Javaランタイム環境"
  • 「JavaDevelopmentKit」

メソッドのコードを見ると、現在のバージョンを取得する次の行が見つかります。

object currentVersion = javaKey.GetValue("CurrentVersion");

これにより、「1.7」や「1.6」などの値が返されます。より完全なバージョン番号が必要な場合、一部のインストールでは次の機能が提供されます。

object familyVersion6 = javaKey.GetValue("Java6FamilyVersion");
object familyVersion7 = javaKey.GetValue("Java7FamilyVersion");

一部のインストールでは、ファミリバージョンが存在しませんが、標準のランタイムインストールでは、値「1.6.0_38」および「1.7.0_13」が表示されます。

参照: Antlr4ClassGenerationTaskInternal.cs

于 2013-03-25T15:36:30.430 に答える
0

を削除するjava.CreateNoWindow = true;と、機能します。

于 2013-03-25T15:25:11.293 に答える
0

いくつかのテストの結果、何らかの理由で、探している情報がstandardErrorストリームで見つかることがわかりました。

次のことを試してください。

Process java = new Process();
java.StartInfo.RedirectStandardError = true;
java.StartInfo.CreateNoWindow = true;
java.StartInfo.UseShellExecute = false;
java.StartInfo.FileName = "java";
java.StartInfo.Arguments = "-version";
java.Start();

// version comes out null
string version = java.StandardError.ReadLine();

// There are probably better ways to extract this data but
// I want to get it working before I cross that bridge.
string versionNumber = version.Substring(16, 1);

java.Close();
于 2013-03-25T15:40:21.027 に答える