Подтвердить что ты не робот

Совместимость Java и С#

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

Ответ 3

Я слышал хорошие вещи о IKVM, JVM, который сделал с .NET.

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

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

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

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

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

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