Совместимость с Java и C # - PullRequest
26 голосов
/ 19 августа 2008

У меня есть две программы. Один в C #, а другой в Java. Эти программы, скорее всего, всегда будут работать на одной машине.

Как лучше всего позволить им разговаривать друг с другом?

Итак, чтобы прояснить проблему:

Это персональный проект (поэтому профессиональные / дорогостоящие библиотеки не нужны). Громкость сообщений мала, от 1 до 2 сообщений в секунду. Сообщения небольшие, несколько примитивных типов должны сделать свое дело. Я хотел бы сохранить сложность на низком уровне. Java-приложение развернуто как один jar-файл как плагин для другого приложения. Поэтому чем меньше внешних библиотек мне нужно объединить, тем лучше. У меня есть полный контроль над приложением C #. Как было сказано ранее, оба приложения должны работать на одном компьютере. Прямо сейчас, мое решение было бы использовать сокеты с чем-то вроде формата CSV.

Ответы [ 9 ]

18 голосов
/ 31 октября 2009

Я являюсь автором jni4net , межпроцессного моста с открытым исходным кодом между JVM и CLR. Он построен на основе JNI и PInvoke. Код C / C ++ не требуется. Я надеюсь, что это поможет вам.

9 голосов
/ 20 августа 2008

Кайл имеет правильный подход в вопросе о взаимодействии. Не существует «правильного» ответа, не зная, какие модели использования могут быть.

Любое архитектурное решение, особенно на этом уровне, является компромиссом.

Вы должны спросить себя:

  • Какие сообщения необходимо передавать между системами?
  • Какими типами данных необходимо поделиться?
  • Есть ли важное требование для поддержки сложных объектов модели или это будут делать примитивы + массивы?
  • каков объем данных?
  • Как часто будут происходить взаимодействия?
  • Какова допустимая задержка связи?

Пока у вас не будет понимания ответов или потенциальных ответов на эти вопросы, будет сложно выбрать архитектуру реализации. Как только мы узнаем, какие факторы важны, будет гораздо проще выбрать более подходящих кандидатов для реализации, которые отражают требования работающей системы.

7 голосов
/ 19 августа 2008

Я слышал хорошие вещи о IKVM , JVM, сделанном с .NET.

4 голосов
/ 19 августа 2008

Ice от ZeroC - это действительно высокопроизводительный уровень взаимодействия между предприятиями, который поддерживает Java и .net среди других. Я думаю о нем как об обновленном Corba - у него даже есть свой собственный объектно-ориентированный язык определения интерфейсов, который называется Slice (как IDL в Corba, но на самом деле вполне читабельный).

Набор функций обширный, с гораздо большим предложением, чем веб-сервисы, но, очевидно, это не открытый стандарт, поэтому не стоит принимать легкие решения. Сгенерированный код, который он выплевывает, тоже несколько уродлив ...

3 голосов
/ 20 августа 2008

Я понимаю, что вы говорите о программах на одном компьютере, но мне всегда нравилась идея передачи сообщений в XML через HTTP.

Ваш сервер может быть веб-сервером, готовым принять полезную нагрузку XML. Ваш клиент может отправлять HTTP-сообщения с XML в теле и получать HTTP-ответ с XML в нем.

Одна из причин, по которой мне это нравится, заключается в том, что HTTP является настолько широко используемым протоколом, что его легко принимать или создавать запросы HTTP POST или GET на любом языке (в случае, если вы решите изменить язык клиента или сервера в будущем ). HTTP и XML существуют уже давно, поэтому я думаю, что они здесь, чтобы остаться.

Еще одна причина, по которой мне нравится это то, что ваш сервер может использоваться и другими клиентами, если они знают HTTP и XML.

3 голосов
/ 19 августа 2008

Я использовал JNBridge (http://www.jnbridge.com/jnbpro.htm) в относительно простом проекте, где у нас было клиентское приложение .NET, использующее относительно значительный JAR-файл, полный логики бизнес-объектов, которую мы не хотели переносить. Это работало довольно хорошо , но я бы не сказал, что мы полностью использовали возможности JNBridge.

1 голос
/ 19 августа 2008

Я большой поклонник Thrift стека взаимодействия от Facebook. Вы сказали, что код, вероятно, будет работать на той же машине, так что это может быть излишним, но вы все равно можете его использовать.

0 голосов
/ 16 ноября 2009

Похоже, очень похожий вопрос был задан здесь ранее при переполнении стека (я искал в Google поисковую память для Java-окон):

Эффективная передача данных с Java на C ++ в Windows

Из ответа я бы предложил вам разобраться:

«Самым быстрым решением будет память отображение общего сегмента памяти, и они реализуют кольцевой буфер или другой механизм передачи сообщений. В C ++ это просто, и в Java у вас есть FileChannel.map метод, который делает это возможным. "

0 голосов
/ 26 августа 2008

Если они являются отдельными программами и работают как независимые приложения, вы можете использовать сокеты. Я знаю, что это довольно сложно определить протокол связи, но это будет довольно просто.

Однако, если у вас есть только две отдельные программы, но вы хотите запустить их как одно приложение, то, я думаю, IKVM - лучший подход, предложенный marxidad.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...