Java 和 C# 互操作性

Posted

技术标签:

【中文标题】Java 和 C# 互操作性【英文标题】:Java and C# interoperability 【发布时间】:2010-09-06 05:05:22 【问题描述】:

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

让他们互相交谈的最佳方式是什么?

所以,为了澄清问题:

这是一个个人项目(所以专业/昂贵的图书馆是不行的)。 消息量低,每秒大约有 1 到 2 条消息。 消息很小,一些原始类型应该可以解决问题。 我想保持低复杂性。 java 应用程序部署为单个 jar,作为另一个应用程序的插件。所以我必须合并的外部库越少越好。 我可以完全控制 C# 应用程序。 如前所述,两个应用程序都必须在同一台计算机上运行。 现在,我的解决方案是使用类似 csv 格式的套接字。

【问题讨论】:

关于 CLR/JVM 互操作性有a related discussion。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

你必须问自己:

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

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

【讨论】:

虽然 Cheekysoft 绝对正确,但我猜你最好使用 Java (JAXB) 和 C#(XML 模式定义工具)中的 XML over sockets 和 object-xml 绑定。见:***.com/questions/765422/jaxb-equivalent-in-c【参考方案3】:

我听说过关于 IKVM 的好消息,这是使用 .NET 构建的 JVM。

【讨论】:

我们最近使用 IKVM 在 Java 服务器和 C# UI 之间进行通信。通信协议是 RMI,IKVM 处理得非常好。【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

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

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

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

【讨论】:

我真的很想听听这种方法的吞吐量。我最初阅读这篇文章的想法是,这仅适用于小型有效负载,这仅仅是因为组装和拆卸 XML 并将其放入 http 消息的开销。【参考方案6】:

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

【讨论】:

【参考方案7】:

我是来自 Facebook 的互操作性堆栈Thrift 的忠实粉丝。你说他们的代码可能会在同一台机器上运行,所以它可能有点矫枉过正,但你仍然可以使用它。

【讨论】:

【参考方案8】:

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

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

【讨论】:

【参考方案9】:

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

Efficient data transfer from Java to C++ on windows

从答案我建议你调查一下:

“你最快的解决方案是记忆 映射内存的共享段, 他们实现了一个环形缓冲区或 其他消息传递机制。在 C++ 这很简单,并且在 Java 你有 FileChannel.map 使之成为可能的方法。”

【讨论】:

以上是关于Java 和 C# 互操作性的主要内容,如果未能解决你的问题,请参考以下文章

在没有 Java EE 应用服务器的情况下使用 Web 服务在 C# 和 Java 之间进行互操作?

以互操作方式传递对象 - JavaBean 到 C#

以互操作方式传递对象 - JavaBean 到 C#

Java + OpenOffice,互操作自动化真的这么难吗?

C# 和 C++ 互操作

如何在 C# 和 C++ 之间进行互操作