Подтвердить что ты не робот

Как выполнить Java-программу с С#?

Интересно, знает ли кто-нибудь хороший способ выполнить программу командной строки Java из кода С# во время выполнения?

Это то же самое, что и для исполняемых файлов .EXE?

Будет ли он работать синхронно или асинхронно (что означает, что мне, возможно, придется дождаться окончания потока, чтобы узнать результаты)

В частности, я хотел бы назвать небольшую утилиту (которая, как представляется, написана на Java) из веб-приложения на стороне сервера, чтобы выполнить некоторую обработку в текстовом файле. Я хочу дождаться его завершения, потому что после того, как программа Java завершила обработку текстового файла, я хочу захватить обработанный текст и использовать его в приложении С#.

4b9b3361

Ответ 1

Если вам нужен более тонкий контроль, чем запуск внешней программы, рассмотрим IKVM - http://www.ikvm.net/ - который обеспечивает способ запуска программ Java внутри мир .NET.

Ответ 2

var processInfo = new ProcessStartInfo("java.exe", "-jar app.jar")
                      {
                          CreateNoWindow = true,
                          UseShellExecute = false
                      };
Process proc;

if ((proc = Process.Start(processInfo)) == null)
{
    throw new InvalidOperationException("??");
}

proc.WaitForExit();
int exitCode = proc.ExitCode;
proc.Close();

Ответ 3

То же самое, что и для исполняемых файлов .EXE, только тот исполняемый файл, который вам нужно выполнить, это сам JVM (java.exe).

Итак, внутри вашего кодового вызова С#:

java.exe -jar nameofyourjavaprogram.jar

И все должно быть хорошо.

Если у вас нет java-программы в JAR-библиотеке, просто запустите JVM-запуск со всеми параметрами, которые вам нужны.

Ответ 4

Я добавил пару строк к вышеупомянутому решению. Я хотел вызвать веб-службу из приложения Silverlight, которое обрабатывает некоторые файлы с помощью java на сервере. Вышеупомянутое решение полезно, но я немного изменил его, так что он работает, поскольку вызов через веб-службу немного сложнее. Теперь у вас есть правильный инструмент для задания, С#, когда это необходимо, Java, когда С# не может решить проблему. Всегда полезно знать больше, чем просто один способ делать что-то. Теперь моя веб-служба, созданная в .Net, может разговаривать с Java.

private void Merge(string strPath)
{
  var processInfo = new ProcessStartInfo("C:\\Program Files\\Java\\jdk1.6.0_24\\binjava.exe", "-jar app.jar")
  {
     CreateNoWindow = true,
     UseShellExecute = false
  };

  processInfo.WorkingDirectory = strPath; // this is where your jar file is.
  Process proc;

  if ((proc = Process.Start(processInfo)) == null)
  {
    throw new InvalidOperationException("??");
  }

  proc.WaitForExit();
  int exitCode = proc.ExitCode;
  proc.Close();
}

Ответ 5

Будет ли он работать синхронно или асинхронно

Он будет выполняться асинхронно, если у вас достаточно ядер, в противном случае он запускается независимо, но ваш поток будет иметь контекстный переключатель, чтобы другая программа работала. В любом случае это не то, о чем вам нужно беспокоиться.

Ответ 6

Согласен. IKVM серьезно делает большую работу по экспорту файлов jar в .NET. Это серьезно удивительно.

Ответ 7

Возможно, он будет работать быстрее, если вы используете jni4net - С#/Java bridge

Ответ 8

Только для полноты: Когда вы оцениваете Swing jar из С#, я нашел эту деталь: если вы не установите рабочий каталог в объекте ProcessStartInfo, ваше блестящее приложение Swing запустится... , но без значков и изображений!

Это минимальный рабочий код, скопированный из ответов здесь и в другом месте на SO (работает для меня: Java 1.8 на Win7, mi изображения и значки находятся в подпапке рабочего каталога):

ProcessStartInfo psi = new ProcessStartInfo("java.exe", " -jar \"C:\\Program Files\\Installed Shiny Swing jar app\\Myjar.jar\"");
psi.WorkingDirectory = "C:\\Program Files\\Installed Shiny Swing jar app\\"; // Do not miss this line so you awesome Swing app will show default java icon and no images
psi.CreateNoWindow = true;
psi.UseShellExecute = false;
Process p = new Process();
p.StartInfo = psi;
p.Start();