2009-05-17 109 views
20

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

¿Es lo mismo que ejecutar archivos nativos .EXE?

lo ejecutará de forma sincrónica o asincrónica (lo que significa que es posible que tenga que esperar a que el hilo a fin de averiguar los resultados)

Específicamente me gustaría llamar a una pequeña utilidad (que pasa a ser escrito 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 programa Java termine de procesar el archivo de texto, quiero tomar el texto procesado y usarlo dentro de la aplicación C#.

Respuesta

15

Si necesita un control más preciso que el inicio de un programa externo, entonces considere IKVM - http://www.ikvm.net/ - que proporciona una forma de ejecutar programas Java dentro de un mundo .NET.

+0

Esto es perfecto, eso es lo que estaba buscando pero no lo hice ¡Creo que existió! – 7wp

+0

¡Esta herramienta es extremadamente agradable! Estoy sentado en el proyecto con un montón de acceso a datos desde Java y la aplicación front-end en .Net y resolví todos mis problemas. – StefanE

+0

alguien sabe si este proyecto está muerto? 2012 parece ser la última actualización y solo v7 ... not v8 – BerggreenDK

10

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

Así, dentro de su código C# llamada:

java.exe-jar nameofyourjavaprogram.jar

y que debe estar bien.

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

+0

También tenga en cuenta que hay una DLL puede invocar en caso de que necesite algo de vuelta de la JVM. –

20
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(); 
+1

+1 idea correcta, ejemplo muy pobre –

+1

Esta es la única solución que funcionó para mí .. Gracias :) –

+0

'UseShellExecute = false' me funcionó –

2

¿Funcionará de forma sincrónica o asincrónica

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

1

De acuerdo. IKVM hace un gran trabajo al exponer archivos jar en .NET. Es realmente sorprendente.

4

he añadido 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(); 
} 
1

Sólo por la integridad: Cuando lauching un frasco de giro: C# me encontré con este detalle: si no se establece el directorio de trabajo en el objeto ProcessStartInfo, su aplicación oscilación brillante pondrá en marcha ... pero sin iconos 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, imágenes e iconos son mi en una subcarpeta de la workingDirectory):

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