1

我们想在我们的 Java 项目中使用现有的 C# 源代码。到目前为止,这不会是一个大问题,因为使用例如 Java 本地接口 (JNI) 非常简单。问题是该软件也应在非 Windows 操作系统上运行。因此,我们可以使用 Mono 编译 C# 源代码,以使它们在例如 Linux 上可执行。但是 Java 内部的集成又如何呢?JNI 或任何基于 COM 的 C# <-> Java 互操作性解决方案都依赖于操作系统,并且仅适用于例如 Windows。

一种可能的解决方案是实施 Web 服务。有没有人知道如何解决这个问题?我将非常感谢其他建议!

非常感谢!

问候

4

2 回答 2

2

这可能不是一个“答案”,更多的是关于我如何看待类似(我认为)情况的讨论。

我对基于 C#/.Net 的客户端-服务器风格系统进行了重大投资。因此,当我决定我也想支持一个 Android“客户端”应用程序时,我研究了各种选项。对我来说,最重要的因素是将我的 C# 类维护为现有系统和要编写的 Java Android 应用程序之间对象交换的定义类。

我最终确定并根据自己的喜好调整了一个系统,其中 Google Protocol Buffers 是交换媒体。(如果您不熟悉它们,它们是一种类似 JSON 的交换格式。) https://developers.google.com/protocol-buffers/

在 .Net 端,我使用由 Marc Gravell 编写的 ProtoBuf-Net(我相信他在 SO 工作)。它包括获取 .Net 对象和生成 .proto 文件(协议缓冲区的定义文件)的能力。 https://code.google.com/p/protobuf-net/

在 Android 端,我使用由 David Yu 编写的 ProtoStuff。他的代码中有一部分采用 .proto 文件并生成相应的 Java 类。 https://code.google.com/p/protostuff/

我遇到的一个问题是,这不适用于作为派生类的 .Net 类,其中大多数是派生类。我创建了一个解决方法,在我对此处答案的评论中进行了描述: 如何让 protobuf-net 在 .Net 中展平和取消展平继承的类?

现在,这令我满意。

请注意,我根本没有谈到 Android 应用程序如何连接到基于 Windows 的系统以及如何执行通信。这对我来说是次要的——我的主要考虑是让 C# 类定义成为明确的定义,并自动从它们创建 Java 类,然后是对象到对象的交换。(如果我使用的是自制的 TCP/IP 通信链接,但实际的通信可以是任何东西,也可能是 Web 服务。)

希望这可以帮助。

于 2014-10-04T18:35:26.223 回答
1

所以我对这个话题做了很多研究,想和大家分享我的发现:

一种(从技术角度来看非常有吸引力)选择是使用 Java 和 .Net 之间的商业桥梁。当然,最受欢迎的产品是JNBridgeJavonet. 这两种产品似乎都非常易于使用,具有良好的支持并且看起来非常复杂。特别是 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/。在考虑通信运行时,此选项可能有一个潜在的缺点,但可能是我们要走的路。

希望这可以帮助将来遇到同样问题的任何人。

于 2014-10-11T19:59:22.233 回答