2008-08-19 36 views
22

Tengo dos programas. Uno está en C# y otro en Java. Esos programas, muy probablemente, se ejecutarán siempre en la misma máquina.Interoperabilidad Java y C#

¿Cuál sería la mejor manera de que hablen entre ellos?

Por lo tanto, para aclarar el problema:

Este es un proyecto personal (bibliotecas de manera profesional/costosos son un no ir). El volumen del mensaje es bajo, habrá de 1 a 2 mensajes por segundo. Los mensajes son pequeños, algunos tipos primitivos deberían hacer el truco. Me gustaría mantener la complejidad baja. La aplicación Java se implementa como un único contenedor como un complemento para otra aplicación. Entonces, cuanto menos bibliotecas externas tenga que fusionar, mejor. Tengo control total sobre la aplicación C#. Como dije antes, ambas aplicaciones deben ejecutarse en la misma computadora. En este momento, mi solución sería usar sockets con algún tipo de formato csv.

+0

Hay [una discusión relacionada] (http://stackoverflow.com/questions/3602091/call-clr-code-from-jvm) sobre la interoperabilidad de CLR/JVM. –

Respuesta

1

Soy un gran fan de Thrift una pila de interoperabilidad de Facebook. Dijiste que el código probablemente se ejecutará en la misma máquina, por lo que podría ser excesivo pero aún así puedes usarlo.

3

Utilicé JNBridge (http://www.jnbridge.com/jnbpro.htm) en un proyecto relativamente simple en el que teníamos una aplicación de cliente .NET que utilizaba un archivo jar relativamente importante lleno de lógica de objeto comercial que no queríamos exportar. Funcionó bastante bien, pero no diría que ejercitamos completamente las capacidades de JNBridge.

7

He oído cosas buenas sobre IKVM, la JVM que está hecha con .NET.

+0

recientemente utilizamos IKVM para comunicarnos entre un servidor Java y la interfaz de usuario de C#. El protocolo de comunicación fue RMI que IKVM manejó muy bien. – Matt

+0

+1 Utilizamos IKVM extensivamente –

4

Ice de ZeroC es una capa de interoperabilidad "empresarial" de alto rendimiento que admite Java y .net, entre otros. Lo considero un Corba actualizado, incluso tiene su propio lenguaje de definición de interfaz orientado a objetos llamado Slice (como el IDL de Corba, pero realmente bastante legible).

El conjunto de características es extenso, con mucho más en oferta que los servicios web, pero claramente no es un estándar abierto, por lo que no es una decisión a tomar a la ligera. El código generado que escupe es algo feo también ...

8

Kyle tiene el enfoque correcto al preguntar acerca de la interacción. No hay una respuesta "correcta" sin saber cuáles son los patrones de uso.

Cualquier decisión arquitectónica, especialmente a este nivel, es una solución de compromiso.

Usted debe preguntarse:

  • ¿Qué tipo de mensajes que se deben transmitir entre los sistemas?
  • ¿Qué tipos de datos deben compartirse?
  • ¿Existe un requisito importante para admitir objetos de modelo complejos o lo harán las primitivas + matrices?
  • ¿Cuál es el volumen de los datos?
  • ¿Con qué frecuencia ocurrirán las interacciones?
  • ¿Cuál es la latencia de comunicación aceptable?

Hasta que tenga una comprensión de las respuestas, o posibles respuestas, a esas preguntas, será difícil elegir una arquitectura de implementación. Una vez que sabemos qué factores son importantes, será mucho más fácil elegir los candidatos de implementación más adecuados que reflejen los requisitos del sistema en ejecución.

+0

Aunque Cheekysoft tiene toda la razón, creo que es mejor que tengas XML sobre sockets y enlaces object-xml en Java (JAXB) y C# (Herramienta de definición de esquemas XML). Ver: http://stackoverflow.com/questions/ 765422/jaxb-equivalent-in-c – Carsten

3

Me di cuenta de que habla de programas en la misma máquina, pero siempre me ha gustado la idea de pasar mensajes en XML a través de HTTP.

Su servidor podría ser un servidor web que esté listo para aceptar una carga XML. Su cliente puede enviar mensajes HTTP con XML en el cuerpo y recibir una respuesta HTTP con XML.

Una razón por la que me gusta es que HTTP es un protocolo ampliamente utilizado que es fácil de aceptar o crear HTTP POST o GET en cualquier idioma (en caso de que decida cambiar el idioma del cliente o del servidor en el futuro). HTTP y XML han estado disponibles por un tiempo, así que creo que están aquí para quedarse.

Otra razón por la que me gusta es que su servidor también podría ser utilizado por otros clientes, siempre que conozcan HTTP y XML.

+1

Estaría realmente interesado en conocer el rendimiento en este enfoque. Mi pensamiento inicial al leer esto fue que esto sería factible solo para pequeñas cargas debido simplemente a la sobrecarga de ensamblar y desensamblar el XML y ponerlo en un mensaje http. –

0

Si son programas separados y se ejecutan como aplicaciones independientes, puede usar sockets. Sé que es un poco complejo definir el protocolo de comunicación, pero será bastante directo.

Sin embargo, si tiene solo dos programas separados pero desea ejecutarlos como una sola aplicación, entonces supongo que IKVM es un mejor enfoque según lo sugerido por marxidad.

15

Soy el autor de jni4net, puente interproceso de código abierto entre JVM y CLR. Se basa en JNI y PInvoke. No se necesita código C/C++. Espero que te ayude.

0

Parece una pregunta muy similar se ha hecho antes aquí en desbordamiento de pila (yo estaba buscando en Google de ventanas java memoria compartida):

Efficient data transfer from Java to C++ on windows

De la respuesta que yo sugeriría que investigue:

"Su solución más rápida será la memoria la asignación de un segmento compartido de memoria, y les la implementación de una memoria intermedia u otros meca de paso de mensajes sm. En C++ esto es sencillo, y en Java que tienen la método FileChannel.map que hace que sea posible ".

Cuestiones relacionadas