33

I have two programs. One is in C# and another one in Java. Those programs will, most probably, always run on the same machine.

What would be the best way to let them talk to each other?

So, to clarify the problem:

This is a personal project (so professional/costly libraries are a no go). The message volume is low, there will be about 1 to 2 messages per second. The messages are small, a few primitive types should do the trick. I would like to keep the complexity low. The java application is deployed as a single jar as a plugin for another application. So the less external libraries I have to merge, the better. I have total control over the C# application. As said earlier, both application have to run on the same computer. Right now, my solution would be to use sockets with some sort of csv-like format.

4

9 回答 9

19

我是jni4net的作者,它是 JVM 和 CLR 之间的开源进程间桥梁。它建立在 JNI 和 PInvoke 之上。无需 C/C++ 代码。我希望它会帮助你。

于 2009-10-31T18:37:10.033 回答
9

凯尔在询问互动时采用了正确的方法。如果不知道使用模式可能是什么,就没有“正确”的答案。

任何架构决策——尤其是在这个级别上——都是一种权衡。

你必须问自己:

  • 系统之间需要传递什么样的消息?
  • 需要共享哪些类型的数据?
  • 是否有支持复杂模型对象的重要要求,或者原语 + 数组会这样做吗?
  • 数据量是多少?
  • 交互发生的频率如何?
  • 可接受的通信延迟是多少?

在您了解这些问题的答案或潜在答案之前,很难选择实施架构。一旦我们知道哪些因素是重要的,选择反映运行系统要求的更合适的实现候选将容易得多。

于 2008-08-19T20:16:50.030 回答
7

I've heard good things about IKVM, the JVM that's made with .NET.

于 2008-08-19T18:41:12.843 回答
4

ZeroC 的Ice是一个真正高性能的“企业级”互操作层,支持 Java 和 .net 等。我认为它是一个更新的 Corba——它甚至有自己的面向对象的接口定义语言,称为Slice(类似于 Corba 的 IDL,但实际上可读性很强)。

该功能集非常广泛,提供的功能远远超过 Web 服务,但显然它不是一个开放标准,因此不能轻易做出决定。它吐出的生成代码也有点难看......

于 2008-08-19T19:32:30.057 回答
4

我知道您说的是同一台机器上的程序,但我一直很喜欢通过 HTTP 以 XML 格式传递消息的想法。

您的服务器可以是准备好接受 XML 有效负载的 Web 服务器。您的客户端可以发送带有 XML 正文的 HTTP 消息,并接收带有 XML 的 HTTP 响应。

我喜欢这个的一个原因是 HTTP 是一种广泛使用的协议,它很容易接受或创建任何语言的 HTTP POST 或 GET 请求(如果您决定将来更改客户端或服务器语言)。HTTP 和 XML 已经存在了一段时间,所以我认为它们会继续存在。

我喜欢它的另一个原因是您的服务器也可以被其他客户端使用,只要他们知道 HTTP 和 XML。

于 2008-08-20T02:19:53.450 回答
3

I used JNBridge (http://www.jnbridge.com/jnbpro.htm) on a relatively simple project where we had a .NET client app using a relatively significant jar file full of business object logic that we didn't want to port. It worked quite nicely, but I wouldn't say we fully exercised the capabilities of JNBridge.

于 2008-08-19T18:35:04.757 回答
1

I am a big fan of Thrift an interoperability stack from Facebook. You said they code will probably run on the same machine so it could be overkill but you can still use it.

于 2008-08-19T18:34:19.347 回答
0

如果它们是独立的程序并作为独立的应用程序运行,则可以使用套接字。我知道定义通信协议有点复杂,但它会非常简单。

但是,如果您只有两个独立的程序但想将它们作为单个应用程序运行,那么我想 IKVM 是 marxidad 建议的更好的方法。

于 2008-08-26T08:01:59.290 回答
0

似乎在堆栈溢出之前已经提出了一个非常相似的问题(我正在谷歌搜索 java windows 共享内存):

在 Windows 上从 Java 到 C++ 的高效数据传输

从答案中,我建议您进行调查:

“你最快的解决方案是内存映射一个共享的内存段,然后它们实现一个环形缓冲区或其他消息传递机制。在 C++ 中这是直截了当的,而在 Java 中你有 FileChannel.map 方法,这使得它成为可能。”

于 2009-11-16T03:34:22.590 回答