Java和C#的互操作性

时间:2020-03-05 18:40:50  来源:igfitidea点击:

我有两个程序。一个在Cand中,另一个在Java中。
这些程序很可能总是在同一台计算机上运行。

让他们彼此交谈的最佳方法是什么?

因此,要澄清问题:

这是一个个人项目(因此,专业/昂贵的图书馆是行不通的)。
消息量很低,每秒大约有1至2条消息。

解决方案

回答

消息很小,一些原始类型应该可以解决问题。
我想保持较低的复杂性。
Java应用程序作为单个jar部署为另一个应用程序的插件。因此,我必须合并的外部库越少越好。
我完全控制Capplication。
如前所述,两个应用程序必须在同一台计算机上运行。
现在,我的解决方案是使用某种类似于csv格式的套接字。

回答

我是Thrift来自Facebook的互操作性堆栈的忠实拥护者。我们说过,他们的代码可能会在同一台计算机上运行,​​因此可能会过大,但是我们仍然可以使用它。

回答

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

回答

我听说过有关IKVM(由.NET制成的JVM)的好消息。

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

回答

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

凯尔(Kyle)在询问互动时采用了正确的方法。在不知道使用模式可能是什么的情况下,没有"正确"的答案。

任何体系结构决策(尤其是在此级别上)都是一种折衷方案。

  • 系统之间需要传递什么样的消息?
  • 哪些类型的数据需要共享?
  • 是否有支持复杂模型对象的重要要求,或者基元+数组会支持吗?
  • 数据量是多少?
  • 相互作用将多久发生一次?
  • 可接受的通信延迟是多少?

我们必须问自己:

回答

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

我意识到我们在谈论同一台机器上的程序,但是我一直很喜欢通过HTTP通过XML传递消息的想法。

服务器可以是准备接受XML有效负载的Web服务器。客户端可以在主体中发送包含XML的HTTP消息,并在其中接收具有XML的HTTP响应。

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

回答

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

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

回答

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

回答

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

在堆栈溢出之前,我曾问过一个非常类似的问题(我在Google上搜索Java Windows共享内存):

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

"Your fastest solution will be memory
  mapping a shared segment of memory,
  and them implementing a ring-buffer or
  other message passing mechanism. In
  C++ this is straight forward, and in
  Java you have the FileChannel.map
  method which makes it possible."

段落数量不匹配