Ответ 1
Если вам нужен более тонкий контроль, чем запуск внешней программы, рассмотрим IKVM - http://www.ikvm.net/ - который обеспечивает способ запуска программ Java внутри мир .NET.
Интересно, знает ли кто-нибудь хороший способ выполнить программу командной строки Java из кода С# во время выполнения?
Это то же самое, что и для исполняемых файлов .EXE?
Будет ли он работать синхронно или асинхронно (что означает, что мне, возможно, придется дождаться окончания потока, чтобы узнать результаты)
В частности, я хотел бы назвать небольшую утилиту (которая, как представляется, написана на Java) из веб-приложения на стороне сервера, чтобы выполнить некоторую обработку в текстовом файле. Я хочу дождаться его завершения, потому что после того, как программа Java завершила обработку текстового файла, я хочу захватить обработанный текст и использовать его в приложении С#.
Если вам нужен более тонкий контроль, чем запуск внешней программы, рассмотрим IKVM - http://www.ikvm.net/ - который обеспечивает способ запуска программ Java внутри мир .NET.
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();
То же самое, что и для исполняемых файлов .EXE, только тот исполняемый файл, который вам нужно выполнить, это сам JVM (java.exe).
Итак, внутри вашего кодового вызова С#:
java.exe -jar nameofyourjavaprogram.jar
И все должно быть хорошо.
Если у вас нет java-программы в JAR-библиотеке, просто запустите JVM-запуск со всеми параметрами, которые вам нужны.
Я добавил пару строк к вышеупомянутому решению. Я хотел вызвать веб-службу из приложения 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();
}
Будет ли он работать синхронно или асинхронно
Он будет выполняться асинхронно, если у вас достаточно ядер, в противном случае он запускается независимо, но ваш поток будет иметь контекстный переключатель, чтобы другая программа работала. В любом случае это не то, о чем вам нужно беспокоиться.
Согласен. IKVM серьезно делает большую работу по экспорту файлов jar в .NET. Это серьезно удивительно.
Возможно, он будет работать быстрее, если вы используете jni4net - С#/Java bridge
Только для полноты: Когда вы оцениваете 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();