¿Cómo ejecutar un progtwig Java desde C #?

¿Se pregunta si alguien sabe una buena forma de ejecutar un progtwig de línea de comandos de Java desde el código C # en tiempo de ejecución?

¿Es lo mismo que ejecutar archivos .EXE nativos?

¿Se ejecutará de forma síncrona o asincrónica (lo que significa que tendré que esperar a que el hilo termine para descubrir los resultados)

Específicamente, me gustaría llamar a una pequeña utilidad (que resulta estar escrita en Java) desde una aplicación web en el lado del servidor para hacer algún procesamiento en un archivo de texto. Quiero esperar a que termine porque después de que el progtwig Java termine de procesar el archivo de texto, quiero tomar el texto procesado y usarlo dentro de la aplicación C #.

Si necesita un control más preciso que iniciar un progtwig externo, considere IKVM – http://www.ikvm.net/ – que proporciona una forma de ejecutar progtwigs Java dentro de un mundo .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(); 

Es lo mismo que ejecutar archivos .EXE nativos, solo que el ejecutable que tendrá que ejecutar es la propia JVM (java.exe).

Entonces, dentro de tu código C llama:

java.exe -jar nameofyourjavaprogram.jar

Y deberías estar bien.

Si no tiene su progtwig Java en una biblioteca JAR, solo haga que JVM se inicie con todos los parámetros que necesita.

Agregué un par de líneas a la solución anterior. Quería llamar a un servicio web desde una aplicación de Silverlight que procesa algunos archivos usando java en el servidor. La solución anterior es útil, pero modifiqué un poco para que funcione, ya que llamar a través de un servicio web es un poco más complicado. Ahora tiene la herramienta adecuada para el trabajo, C # cuando corresponda, Java cuando C # no puede resolver el problema. Siempre es bueno saber más que una sola forma de hacer las cosas. Ahora mi servicio web creado en .Net puede hablar con 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(); } 

Se ejecutará de forma síncrona o asíncrona

Se ejecutará de forma asíncrona si tiene suficientes núcleos, de lo contrario se ejecutará de forma independiente, pero su hilo tendrá que cambiar de contexto para que se ejecute el otro progtwig. De cualquier forma, no es algo de lo que deba preocuparse.

Solo por la completitud: al lanzar un jar Swing desde C # encontré este detalle: si no configura el directorio de trabajo en el objeto ProcessStartInfo, se iniciará su shiny aplicación Swing … ¡¡¡ pero sin icons ni imágenes !!

Este es el código de trabajo mínimo copiado de las respuestas aquí y en otros lugares en SO (funciona para mí: Java 1.8 en Win7, mis imágenes e icons están en una subcarpeta del directorio de trabajo):

 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(); 

Tal vez funcionaría más rápido si usa jni4net – C # / Java bridge