繁体   English   中英

如何检查我在 C# 中运行的是 32 位还是 64 位 java

[英]How can I check if I am running 32bit or 64bit java in C#

我正在编写我的第一个 C# 程序,如果我运行的是 32 位或 64 位版本的 java,我想使用 C# 代码进行检查?

我试过了,但是当我将此代码添加到我的班级时,我无法调试它

RegistryKey rk = Registry.LocalMachine;
RegistryKey subKey = rk.OpenSubKey("SOFTWARE\\JavaSoft\\Java Runtime Environment");
string currentVerion = subKey.GetValue("CurrentVersion").ToString();

我该怎么做 ?

谢谢

不清楚您将如何识别您使用的是哪个 java.exe - 一台机器可以安装多个。 您可能有一个特定的路径,或者您可能需要使用JAVA_HOME环境变量,或搜索PATH ,或者将两者结合起来,并根据您的要求优先选择一个或另一个。

获得java.exe的路径后,您可以使用 MSDN 上 Kris Stanton 的技术(我将在此处重复,但目前已在MSDN > "Exploring pe file headers using managed code" 中链接):

public enum MachineType
{
    Native = 0, I586 = 0x014c, Itanium = 0x0200, x64 = 0x8664
}
public static MachineType GetMachineType(string fileName)
{
    // dos header is 64 bytes
    // PE header address is 4 bytes
    const int PE_PTR_OFFSET = 60;
    const int MACHINE_OFFSET = 4;
    byte[] data = new byte[4096];
    using (Stream stm = new FileStream(fileName, FileMode.Open, FileAccess.Read))
    {
        stm.Read(data, 0, 4096);
    }
    int PE_HDR_ADDR = BitConverter.ToInt32(data, PE_PTR_OFFSET);
    int machineUint = BitConverter.ToUInt16(data, PE_HDR_ADDR + MACHINE_OFFSET);
    return (MachineType)machineUint;
}

要在%PATH%变量上查找java.exe ,您可以调用FindOnPath("java.exe")

public static String FindOnPath(string exeName)
{
    foreach (string test in (Environment.GetEnvironmentVariable("PATH") ?? "").Split(';'))
    {
        string path = test.Trim();
        if (!String.IsNullOrEmpty(path) && File.Exists(path = Path.Combine(path, exeName)))
            return Path.GetFullPath(path);
    }
    return null;
}

在我的机器上,以下代码

static void Main(string[] args)
{
    String path = FindOnPath("java.exe");
    Console.WriteLine(path);
    Console.WriteLine(GetMachineType(path));
}

写入以下输出:

C:\ProgramData\Oracle\Java\javapath\java.exe
x64

您可以通过注册表来完成。 我为你整理了一个简单的例子:

private string GetJavaInstallationPath()
{
    string environmentPath = Environment.GetEnvironmentVariable("JAVA_HOME");
    if (!string.IsNullOrEmpty(environmentPath))
    {
       return environmentPath;
    }

    string javaKey = "SOFTWARE\\JavaSoft\\Java Runtime Environment\\";
    using (Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(javaKey))
    {
        string currentVersion = rk.GetValue("CurrentVersion").ToString();
        using (Microsoft.Win32.RegistryKey key = rk.OpenSubKey(currentVersion))
        {
            return key.GetValue("JavaHome").ToString();
        }
    }
}

然后要使用它,只需执行以下操作:

string installPath = GetJavaInstallationPath();
string filePath = System.IO.Path.Combine(installPath, "bin\\Java.exe");
if (System.IO.File.Exists(filePath))
{
    // We have a winner
}

我正在使用此代码:

public static bool CheckJavaInstallation()
{
    try
    {
        //ProcessStartInfo procStartInfo = new ProcessStartInfo("java", " -version"); // Check that any Java installed
        //ProcessStartInfo procStartInfo = new ProcessStartInfo("java", "-d32 -version"); // Check that 32 bit Java installed
        ProcessStartInfo procStartInfo = new ProcessStartInfo("java", "-d64 -version"); // Check that 64 bit Java installed

        procStartInfo.RedirectStandardOutput = true;
        procStartInfo.RedirectStandardError = true;
        procStartInfo.UseShellExecute = false;
        procStartInfo.CreateNoWindow = true;
        Process proc = new Process {StartInfo = procStartInfo};
        proc.Start();

        proc.BeginOutputReadLine();
        proc.BeginErrorReadLine();
        proc.WaitForExit();
        return proc.ExitCode == 0;
    }
    catch (Exception ex)
    {
        return false;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM