Я пытаюсь динамично выполнить .jar от блока C# (использование Process.Start(info)
). Теперь, из консольного приложения я могу просто работать:
ProcessStartInfo info = new ProcessStartInfo("java", "-jar somerandom.jar");
В блоке, однако, я продолжаю получать a Win32Exception
из "Системы не может найти файл указанным" и иметь для изменения строки на полный путь Java как так:
ProcessStartInfo info = new ProcessStartInfo("C:\\Program Files\\Java\\jre6\\bin\\java.exe", "-jar somerandom.jar");
Это, очевидно, не сделает. Мне нужен путь к динамично (но декларативно) определяют установленное местоположение Java.
Я начал думать смотрящий на реестр, но когда я добрался там, я заметил, что были определенные ключи для версий и что они, как даже могли гарантировать, не будут числовыми (например, "Время выполнения HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Environment\1.6" и "Время выполнения HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Environment\1.6.0_20").
Каково было бы самое надежное решение "долгого пути" нахождения самого актуального пути java.exe из приложения C#?
Большое спасибо заранее.
- РЕДАКТИРОВАНИЕ -
Благодаря комбинации ответов GenericTypeTea и Stephen Cleary я решил проблему со следующим:
private String GetJavaInstallationPath()
{
String javaKey = "SOFTWARE\\JavaSoft\\Java Runtime Environment";
using (var baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey(javaKey))
{
String currentVersion = baseKey.GetValue("CurrentVersion").ToString();
using (var homeKey = baseKey.OpenSubKey(currentVersion))
return homeKey.GetValue("JavaHome").ToString();
}
}
Сделать это можно через реестр. Но вы искали не в том месте. Я собрал для вас быстрый пример:
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
}
Насколько мне известно, идея заключается в том, что последняя версия Java, установленная в системе, является первой, найденной в переменной среды PATH, поэтому вам не нужно искать какие-либо ключи реестра, просто запустите ее.
Попробуйте:
ProcessStartInfo info = new ProcessStartInfo("java.exe", "-jar somerandom.jar");
Если это не сработает, убедитесь, что java.exe находится на вашем пути, и дайте мне знать.