2008-08-19 10 views
22

Ich habe zwei Programme. Einer ist in C# und ein anderer in Java. Diese Programme werden höchstwahrscheinlich immer auf demselben Computer ausgeführt.Java und C# Interoperabilität

Was wäre der beste Weg, sie miteinander reden zu lassen?

Also, um das Problem zu klären:

Dies ist ein persönliches Projekt (so professionell/kostspielig Bibliotheken ein no go) sind. Die Nachrichtenlautstärke ist niedrig, es werden etwa 1 bis 2 Nachrichten pro Sekunde angezeigt. Die Nachrichten sind klein, ein paar primitive Typen sollten den Trick machen. Ich möchte die Komplexität niedrig halten. Die Java-Anwendung wird als einzelnes Jar als Plugin für eine andere Anwendung bereitgestellt. Je weniger externe Bibliotheken ich zusammenführen muss, desto besser. Ich habe die totale Kontrolle über die C# -Anwendung. Wie bereits erwähnt, müssen beide Anwendungen auf demselben Computer ausgeführt werden. Im Moment wäre meine Lösung, Sockets mit einer Art von CSV-Format zu verwenden.

+0

Es ist [eine ähnliche Diskussion] (http://stackoverflow.com/questions/3602091/call-clr-code-from-jvm) über die CLR/JVM-Interoperabilität –

Antwort

1

Ich bin ein großer Fan von Thrift ein Interoperabilitäts-Stack von Facebook. Du hast gesagt, dass der Code wahrscheinlich auf demselben Computer läuft, so dass es Overkill sein könnte, aber du kannst es trotzdem benutzen.

3

Ich habe JNBridge (http://www.jnbridge.com/jnbpro.htm) in einem relativ einfachen Projekt verwendet, in dem wir eine .NET-Client-App hatten, die eine relativ umfangreiche JAR-Datei voller Geschäftsobjektlogik verwendete, die wir nicht portieren wollten. Es hat ganz gut funktioniert, aber ich würde nicht sagen, dass wir die Fähigkeiten von JNBridge voll ausgenutzt haben.

7

Ich habe gute Dinge über IKVM gehört, die JVM, die mit .NET gemacht wird.

+0

wir haben kürzlich IKVM verwendet, um zwischen einem Java-Server und C# UI zu kommunizieren Das Kommunikationsprotokoll war RMI, das IKVM sehr gut behandelte – Matt

+0

+1 Wir verwenden IKVM hübsch extensiv –

4

Ice von ZeroC ist eine sehr leistungsfähige "Enterprise" -Interop-Schicht, die unter anderem Java und .net unterstützt. Ich sehe es als aktualisierten Corba - es hat sogar seine eigene objektorientierte Schnittstelle Definition Sprache genannt Slice (wie Corba IDL, aber eigentlich ziemlich lesbar).

Das Feature-Set ist umfangreich, mit viel mehr als Web-Services, aber es ist eindeutig kein offener Standard, also keine Entscheidung zu leicht gemacht. Der generierte Code, den es ausspuckt, ist auch etwas hässlich ...

8

Kyle hat den richtigen Ansatz, um nach der Interaktion zu fragen. Es gibt keine "richtige" Antwort, ohne zu wissen, welche Nutzungsmuster wahrscheinlich sind.

Jede architektonische Entscheidung - besonders auf dieser Ebene - ist ein Kompromiss.

Sie müssen sich fragen:

  • Welche Art von Nachrichten zwischen den Systemen übergeben werden müssen?
  • Welche Arten von Daten müssen geteilt werden?
  • Gibt es eine wichtige Anforderung, komplexe Modellobjekte zu unterstützen, oder werden Primitive + Arrays funktionieren?
  • Wie groß ist die Datenmenge?
  • Wie häufig treten die Wechselwirkungen auf?
  • Was ist die akzeptable Kommunikationslatenz?

Bis Sie die Antworten oder möglichen Antworten auf diese Fragen verstehen, wird es schwierig sein, eine Implementierungsarchitektur zu wählen. Sobald wir wissen, welche Faktoren wichtig sind, wird es viel einfacher sein, die geeigneteren Implementierungskandidaten auszuwählen, die die Anforderungen des laufenden Systems widerspiegeln.

+0

Obwohl Cheekysoft absolut Recht hat, ist meine Vermutung, dass Sie am besten mit XML-über-Sockets und object-xml-Bindung in Java (JAXB) und C# (XML-Schema-Definitions-Tool) sind. Siehe: http://StackOverflow.com/questions/ 765422/jaxb-äquivalent-in-c – Carsten

3

Ich weiß, dass Sie über Programme auf dem gleichen Computer sprechen, aber ich mochte immer die Idee, Nachrichten in XML über HTTP zu übergeben.

Ihr Server könnte ein Webserver sein, der bereit ist, eine XML-Nutzlast zu akzeptieren. Ihr Client kann HTTP-Nachrichten mit XML im Hauptteil senden und eine HTTP-Antwort mit XML empfangen.

Ein Grund, warum ich das mag ist, dass HTTP ein so weit verbreitetes Protokoll ist, dass es einfach ist, HTTP POST oder GET Anfragen in jeder Sprache zu akzeptieren oder zu erstellen (für den Fall, dass Sie sich entscheiden, die Client- oder Serversprache zu ändern Zukunft). HTTP und XML gibt es schon eine Weile, also denke ich, dass sie hier sind um zu bleiben.

Ein weiterer Grund, warum ich es mag, ist, dass Ihr Server auch von anderen Clients verwendet werden kann, solange sie HTTP und XML kennen.

+1

Ich wäre wirklich interessiert, über den Durchsatz in diesem Ansatz zu hören. Mein erster Gedanke, dies zu lesen, war, dass dies nur für kleine Nutzlasten machbar wäre, einfach aufgrund des Overheads des Zusammenstellens und Zerlegens des XML und des Einfügens in eine http-Nachricht. –

0

Wenn sie separate Programme sind und als unabhängige Anwendungen ausgeführt werden, können Sie Sockets verwenden. Ich weiß, dass es etwas komplex ist, ein Kommunikationsprotokoll zu definieren, aber es wird ziemlich einfach sein.

Wenn Sie jedoch nur zwei separate Programme haben, die Sie jedoch als einzelne Anwendung ausführen möchten, dann ist IKVM ein besserer Ansatz, wie von marxidad vorgeschlagen.

15

Ich bin Autor von jni4net, Open-Source-Interprozess-Brücke zwischen JVM und CLR. Es ist auf JNI und PInvoke aufgebaut. Kein C/C++ Code benötigt. Ich hoffe es hilft dir.

0

Es hat eine sehr ähnliche Frage erscheint hat, bevor hier auf Stack-Überlauf gefragt worden (ich war für Java-Fenster Shared-Memory-Google-Suche):

Efficient data transfer from Java to C++ on windows

Aus der Antwort würde ich vorschlagen, Sie zu untersuchen:

„Ihre schnellste Lösung Speicher Zuordnen eines gemeinsam genutzten Speichersegment sein, und sie einen Ring-Puffer oder andere message passing mechani Umsetzung sm. In C++ ist dies gerade nach vorn, und in Java haben Sie die FileChannel.map Methode, die es ermöglicht.“

Verwandte Themen