C#判断Jre位数一直是我在开发启动器时困扰的问题。因为判断Jre位数才能使启动器正确的分配游戏启动内存
C#可以很快捷的获取系统的位数,在32位系统上是最容易判断Jre位数的。因为32位的系统只能安装32位的Jre。但是当在64位系统中,就会有两种可能。64位系统支持32位或64位的Jre,用户的平台上可能出现两种可能性。当时在解决这个问题上面花费了很长时间。我曾经在很多群里面咨询过。大部分开发者都使用注册表获取Jre位数?此后我研究了很久JAVA的注册表结构,最终还是无法获得任何思路。放弃了这个方法
后来我也研究过Jre目录下的文件是否可以获得部分信息,比如配置文件,说明文件什么的。但最终还是因为极少的线索和不同Jre版本可能带来的不同放弃了
百般无奈下我我打开cmd随便找找有什么线索
当打开cmd输入java -version时。我注意到一个小细节,最后一行出现了64-Bit字眼。
我查看了目前我电脑上唯一装的Jre,没错,的确是64位的。
接下来为了做实验,我下载了JAVA1.7 32位和64位和JAVA1.8 32位分别用cmd执行java.exe -versions。
结论是正确的。32位和64位Jre显示的确有区别。接下来用C#就很简单实现了。
因为我是使用KMCCC获取java版本列表。返回的string都是javaw.exe。而javaw.exe是无窗口的。我便替换为java.exe来执行
接下来实例化一个process。设置process启动信息的文件名为已经替换成java.exe的传递过来的路径。
再设置启动信息的参数为-version,就是我们前面所说到的。
接下来的属性设置大家都应该知道是做什么的了。我也不多解释
最后启动这个process,从头读到尾赋值为result。
最后一步判定字符串中是否含有64-Bit即可判断是否为64位系统
虽然是个很傻的办法,但是还是希望能对一些小白有所帮助
来自群组: Nsiso开发工作室
C#可以很快捷的获取系统的位数,在32位系统上是最容易判断Jre位数的。因为32位的系统只能安装32位的Jre。但是当在64位系统中,就会有两种可能。64位系统支持32位或64位的Jre,用户的平台上可能出现两种可能性。当时在解决这个问题上面花费了很长时间。我曾经在很多群里面咨询过。大部分开发者都使用注册表获取Jre位数?此后我研究了很久JAVA的注册表结构,最终还是无法获得任何思路。放弃了这个方法
后来我也研究过Jre目录下的文件是否可以获得部分信息,比如配置文件,说明文件什么的。但最终还是因为极少的线索和不同Jre版本可能带来的不同放弃了
百般无奈下我我打开cmd随便找找有什么线索
当打开cmd输入java -version时。我注意到一个小细节,最后一行出现了64-Bit字眼。
我查看了目前我电脑上唯一装的Jre,没错,的确是64位的。
接下来为了做实验,我下载了JAVA1.7 32位和64位和JAVA1.8 32位分别用cmd执行java.exe -versions。
结论是正确的。32位和64位Jre显示的确有区别。接下来用C#就很简单实现了。
/// <summary>
/// 返回是否为64位JRE
/// </summary>
/// <param name="path">Jre的javaw.exe路径</param>
/// <returns></returns>
public static bool IsJre64(string path)
{
path = path.Replace("javaw.exe", "java.exe");
Process p = new Process();
p.StartInfo.FileName = path;
p.StartInfo.Arguments = "-version";
p.StartInfo.RedirectStandardError = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.Start();
string result = p.StandardError.ReadToEnd();
bool Is64 = result.Contains("64-Bit");
return Is64;
}
接下来实例化一个process。设置process启动信息的文件名为已经替换成java.exe的传递过来的路径。
再设置启动信息的参数为-version,就是我们前面所说到的。
接下来的属性设置大家都应该知道是做什么的了。我也不多解释
最后启动这个process,从头读到尾赋值为result。
最后一步判定字符串中是否含有64-Bit即可判断是否为64位系统
虽然是个很傻的办法,但是还是希望能对一些小白有所帮助
来自群组: Nsiso开发工作室
判断执行文件是32还是64位的话,我最先想到的是file……
关于msdos完整的magic number列表可以在https://github.com/file/file/blob/master/magic/Magdir/msdos#L100附近找到
猜测file会首先定位PE\0\0,然后往后移4个位置,如果碰到了0x14c就代表这个执行文件是Intel 80386,如果碰到0x8664就代表这个文件是x86-64
以上仅为瞎猜,所以写死的数字也都是乱蒙的,如果出了什么bug或者效率低下应该是很正常的事……
编译方法是按照教程里的C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\csc.exe hello.cs然后hello.exe
关于msdos完整的magic number列表可以在https://github.com/file/file/blob/master/magic/Magdir/msdos#L100附近找到
猜测file会首先定位PE\0\0,然后往后移4个位置,如果碰到了0x14c就代表这个执行文件是Intel 80386,如果碰到0x8664就代表这个文件是x86-64
以上仅为瞎猜,所以写死的数字也都是乱蒙的,如果出了什么bug或者效率低下应该是很正常的事……
另一个方法:把arguments改为"-d32 -version"或"-d64 -version"
若果出现“Error: This Java instance does not support a 32-bit JVM.”(-d32)/"Error: This Java instance does not support a 64-bit JVM."(-d64)即表示此JRE是64位/32位
若果出现“Error: This Java instance does not support a 32-bit JVM.”(-d32)/"Error: This Java instance does not support a 64-bit JVM."(-d64)即表示此JRE是64位/32位