Java和C#互操作性

时间:2008-08-19 18:31:32

标签: c# java interop

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

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

所以,澄清问题:

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

9 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:9)

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

任何架构决策 - 特别是在这个级别 - 是一种权衡。

你必须问问自己:

  • 需要在系统之间传递什么类型的消息?
  • 需要分享哪些类型的数据?
  • 是否有重要的要求支持复杂的模型对象或基元+数组是否会这样做?
  • 数据量是多少?
  • 互动频率会发生多久?
  • 可接受的通信延迟是多少?

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

答案 2 :(得分:7)

我听说过有关IKVM的好东西,这是用.NET制作的JVM。

答案 3 :(得分:4)

来自ZeroC的

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

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

答案 4 :(得分:3)

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

答案 5 :(得分:3)

我意识到你在谈论同一台机器上的程序,但我一直都喜欢用HTTP传递消息的想法。

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

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

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

答案 6 :(得分:1)

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

答案 7 :(得分:0)

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

但是,如果您只有两个单独的程序但希望将它们作为单个应用程序运行,那么我认为IKVM是一种更好的方法,正如marxidad所建议的那样。

答案 8 :(得分:0)

在此之前,有一个非常类似的问题已经被问到堆栈溢出(我在Google上搜索java windows共享内存):

Efficient data transfer from Java to C++ on windows

从答案我建议你去调查:

  

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