所以我对这个话题做了很多研究,想和大家分享我的发现:
一种(从技术角度来看非常有吸引力)选择是使用 Java 和 .Net 之间的商业桥梁。当然,最受欢迎的产品是JNBridge和Javonet. 这两种产品似乎都非常易于使用,具有良好的支持并且看起来非常复杂。特别是 JNBridge 已经支持 Java 和 Mono 之间的桥接,这允许移植到非 Windows 操作系统,这是我们如上所述的主要要求之一。Javonet 也想集成 Mono 并且很快就会发布这个特性。然而,这两种解决方案都是商业化的,需要权衡它们的特性和各自的成本。然而,从纯技术的角度来看,它们看起来很棒,并且还声称能够在 Java 和 .Net 之间实现非常快速的通信(比使用 Web 服务更快)。
另一种选择是通过 COM 连接 Java 和 .NET。由于 COM 通常是独立于平台定义的,因此可以在多个操作系统上运行。有许多开源项目可用于此类实现,例如 EZJCOM、J-Interop、JACOB 或 JCOM。主要限制(特别是对于我们的项目)是 Mono 仅支持 Windows 下的 COM 互操作性(目前)。所以,这对我们来说不是一个真正的选择。但如果您只想在 Windows 上创建 Java-.NET 互操作性,这是一个好方法。
集成 Java 和 C# 的直接方法是使用 Java 本机接口 (JNI)。您还可以找到使 JNI 更易于使用的多种实现,其中最受欢迎的可能是jni4net,它似乎是一个非常活跃且经常使用的项目。但也有其他一些具有特定优缺点的产品,例如咖啡因、浓缩咖啡或 csjni。最后,JNI 不是 100% 独立于平台的。它适用于不同的平台,但您必须生成特定于平台的代码,这使得它显然不太适合我们的目的。如果您将应用程序限制在 Windows 上,jni4net 似乎是一个非常不错的选择。
第三种选择可能是在公共语言运行时中同时运行 Java 和 .Net 部分。因此, Ikvm.net是一种可能且非常流行的解决方案(如上所述 Samuel Audet)。此选项的缺点是 JDK 功能和效率的损失。
最后也是最通用的选择是在 Java 和 .Net 世界之间建立 web 服务。对于这个解决方案,需要找到适当的方法来序列化/反序列化来自/到 Java 和 .Net 的对象。有多种可能的解决方案可用。RenniePet 提到了一个基于 Protocol Buffers 的复杂解决方案。其他也存在,例如http://java-cs-bridge.sourceforge.net/。在考虑通信运行时,此选项可能有一个潜在的缺点,但可能是我们要走的路。
希望这可以帮助将来遇到同样问题的任何人。