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

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

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

所以,为了澄清问题:

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

【问题讨论】:

标签: c# java interop


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    你必须问自己:

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

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

    【讨论】:

    【解决方案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 使之成为可能的方法。”

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-09-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-07-03
              相关资源
              最近更新 更多