Java和C#的互操作性

33

我有两个程序,一个是C#编写的,另一个是Java编写的。 这些程序很可能永远在同一台机器上运行。

那么最好的让它们互相交流的方式是什么呢?

为了澄清问题:

这是一个个人项目(因此专业/昂贵的库不适用)。 消息量很小,大约每秒钟会有1到2条消息。 这些消息很小,几个原始类型应该就足够了。 我想保持复杂度的低下。 Java应用程序作为单个jar部署为另一个应用程序的插件。因此,合并的外部库越少越好。 我对C#应用程序有完全控制权。 如前所述,两个应用程序必须在同一台计算机上运行。 目前,我的解决方案是使用套接字与某种类似csv的格式。


有一个关于CLR/JVM互操作性的相关讨论 - Anderson Green
9个回答

19

我是jni4net的作者,这是一个开源的JVM和CLR之间的跨进程桥接工具。它基于JNI和PInvoke构建,不需要C/C++代码。希望它能够帮到你。


9

Kyle在询问交互方面的正确方法。如果不知道使用模式,就没有“正确”的答案。

任何架构决策--特别是在这个层次上--都是一个权衡。

你必须问自己:

  • 需要在系统之间传递什么样的信息?
  • 需要共享哪些类型的数据?
  • 是否有支持复杂模型对象的重要需求,还是原始数据和数组就可以?
  • 数据量有多大?
  • 交互频率如何?
  • 可接受的通信延迟是多少?

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


虽然Cheekysoft是绝对正确的,但我猜你最好使用Java(JAXB)和C#(XML Schema Definition Tool)中的XML套接字和对象-XML绑定。请参见:https://dev59.com/FXRA5IYBdhLWcg3w9y10 - Carsten

7

我听说过关于IKVM的好评,这是一个使用.NET制作的JVM。


我们最近使用了IKVM在Java服务器和C#用户界面之间进行通信。通信协议是RMI,而IKVM处理得非常好。 - Matt

4

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

其功能集非常广泛,比Web服务提供更多的功能,但显然它不是一个开放标准,所以不能轻易做出决定。生成的代码也有些丑陋...


4

我知道你在谈论同一台机器上的程序,但我一直喜欢通过XML在HTTP上传递消息的想法。

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

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

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


1
我非常想了解这种方法的吞吐量。当我读到这篇文章时,我的第一反应是,由于组装和拆卸XML并将其放入HTTP消息中的开销,这只适用于小负载。 - Thorbjørn Ravn Andersen

3

我在一个相对简单的项目中使用了JNBridge (http://www.jnbridge.com/jnbpro.htm),我们的.NET客户端应用程序使用了一个包含大量业务对象逻辑的jar文件,我们不想进行移植。它工作得非常好,但我不能说我们完全发挥了JNBridge的能力。


1

我是Thrift的铁杆粉丝,它是Facebook推出的一个互操作堆栈。你说它很可能在同一台机器上运行,所以可能有些过度设计,但仍然可以使用。


0

看起来在Stack Overflow上曾经有一个非常相似的问题(我正在谷歌搜索Java Windows共享内存):

Efficient data transfer from Java to C++ on windows

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

“最快的解决方案是内存映射共享内存段,然后实现环形缓冲区或其他消息传递机制。在C ++中,这很简单,在Java中,您可以使用FileChannel.map方法实现。”


0
如果它们是独立的程序并且作为独立应用运行,您可以使用套接字进行通信。我知道定义通信协议可能有点复杂,但这将非常直截了当。
然而,如果您只有两个独立的程序,但想将它们作为单个应用程序运行,那么我认为像marxidad建议的IKVM是更好的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接