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





Я большой поклонник Бережливость - стека взаимодействия от Facebook. Вы сказали, что их код, вероятно, будет работать на одной машине, поэтому это может быть излишним, но вы все равно можете его использовать.
Я использовал JNBridge (http://www.jnbridge.com/jnbpro.htm) в относительно простом проекте, где у нас было клиентское приложение .NET, использующее относительно значительный jar-файл, полный логики бизнес-объектов, которую мы не хотели переносить. Он работал неплохо, но я бы не сказал, что мы полностью использовали возможности JNBridge.
Я слышал хорошие отзывы о ИКВМ, JVM, созданной с помощью .NET.
недавно мы использовали IKVM для связи между сервером Java и пользовательским интерфейсом C#. Протоколом связи был RMI, с которым IKVM прекрасно справлялся.
Лед от ZeroC - это действительно высокопроизводительный корпоративный уровень взаимодействия, который поддерживает, среди прочего, Java и .net. Я думаю об этом как об обновленной Corba - у нее даже есть свой собственный объектно-ориентированный язык определения интерфейса, называемый Ломтик (как IDL Corba, но на самом деле вполне читаемый).
Набор функций обширен, предлагая гораздо больше, чем веб-сервисы, но очевидно, что это не открытый стандарт, поэтому решение не стоит принимать легкомысленно. Сгенерированный код, который он выплевывает, тоже несколько уродлив ...
У Кайла правильный подход, когда он спрашивает о взаимодействии. Не существует «правильного» ответа без знания вероятных шаблонов использования.
Любое архитектурное решение - особенно на этом уровне - это компромисс.
Вы должны спросить себя:
Пока у вас не будет понимания ответов или потенциальных ответов на эти вопросы, будет сложно выбрать архитектуру реализации. Как только мы узнаем, какие факторы важны, будет намного проще выбрать более подходящие варианты реализации, которые отражают требования работающей системы.
Хотя Cheekysoft абсолютно прав, я предполагаю, что вам лучше всего использовать XML поверх сокетов и связывание объект-xml в Java (JAXB) и C# (инструмент определения схемы XML). См .: stackoverflow.com/questions/765422/jaxb-equivalent-in-c
Я понимаю, что вы говорите о программах на одной машине, но мне всегда нравилась идея передачи сообщений в XML через HTTP.
Ваш сервер может быть веб-сервером, готовым принимать полезные данные XML. Ваш клиент может отправлять HTTP-сообщения с XML в теле и получать HTTP-ответ с XML в нем.
Одна из причин, по которой мне это нравится, заключается в том, что HTTP является настолько широко используемым протоколом, что легко принимать или создавать запросы HTTP POST или GET на любом языке (в случае, если вы решите изменить язык клиента или сервера в будущем). HTTP и XML существуют уже давно, поэтому я думаю, что они останутся здесь надолго.
Еще одна причина, по которой мне это нравится, заключается в том, что ваш сервер может использоваться и другими клиентами, если они знают HTTP и XML.
Мне было бы действительно интересно услышать о пропускной способности при таком подходе. Моя первоначальная мысль при чтении этого заключалась в том, что это будет возможно только для небольших полезных нагрузок просто из-за накладных расходов на сборку и разборку XML и размещение его в сообщении http.
Если они являются отдельными программами и работают как независимые приложения, вы можете использовать сокеты. Я знаю, что определить протокол связи немного сложно, но это будет довольно просто.
Однако, если у вас есть всего две отдельные программы, но вы хотите запускать их как одно приложение, то я думаю, что IKVM - лучший подход, как предлагает marxidad.
Я автор jni4net, межпроцессного моста с открытым исходным кодом между JVM и CLR. Он построен на базе JNI и PInvoke. Код C / C++ не требуется. Надеюсь, это вам поможет.
Похоже, что здесь задавался очень похожий вопрос о переполнении стека (я искал в Google разделяемую память java windows):
Эффективная передача данных с Java на C++ в windows
Из ответа я предлагаю вам изучить:
"Your fastest solution will be memory mapping a shared segment of memory, and them implementing a ring-buffer or other message passing mechanism. In C++ this is straight forward, and in Java you have the FileChannel.map method which makes it possible."
Существует связанное обсуждение о взаимодействии CLR / JVM.