从 Java 调用 VB.NET 函数的最佳方法是啥?

Posted

技术标签:

【中文标题】从 Java 调用 VB.NET 函数的最佳方法是啥?【英文标题】:Best way to call VB.NET function from Java?从 Java 调用 VB.NET 函数的最佳方法是什么? 【发布时间】:2013-06-25 04:15:20 【问题描述】:

我正在一家公司实习,担任软件开发人员。有一个用 C# 编写的客户端安装软件程序,它在 VB 中具有 dll - 两者都在 .NET 框架上。我们的整个基于云的服务器都是用 Java 编写的,所以现在,我的任务只是在 Java 中调用一个函数来获取/设置私有(?抱歉,我不太熟悉 VB,所以我可能不恰当地使用这个术语)位于 dll 中的变量。不过,最终我的任务是从客户端程序收集数据并将其放入我们的服务器。过去几天我一直在研究如何进行此操作,并找到了一些选择:

Java 本机访问 (JNA) Java 本机接口 (JNI) COM/ActiveX 网桥(虽然我不能完全确定我知道这些是什么/如何使用它们_ JNBridge

现在据我所知,这些是我分别发现的问题:

使用此选项需要使用 C 或 C++ 从 Java 到 .NET 的中介,并且鉴于我只真正了解 Java,我真的不想陷入这种混乱。 似乎比 JNA 复杂一点,而且我认为它与 JNA 相比并没有真正的优势。它们似乎都需要 C/C++ 中介。 ...除了我不太确定如何实施此方法这一事实之外,真的不能说太多。 这座桥和其他类似的桥必须是最后的手段。这个产品的开发者许可证非常昂贵,我敢肯定他们没有资源来使用这个产品。我可以尝试询问,但我不认为实习生可以要求公司投资这么多。

再加上我不是很擅长编程这一事实,我大部分时间都靠自己做这件事,所以提前非常感谢您阅读我的问题。如果有什么我没有完全解释清楚需要进一步解释,请告诉我!任何其他提示/指针将不胜感激。

【问题讨论】:

这个 DLL 应该直接使用,或者您可以创建一个中间件应用程序,如 .Net WCF 应用程序,提供服务使用 DLL 中的方法? @LuiggiMendoza - 我认为它必须直接从客户端到服务器(如果这是你要问的)。如果您个人认为中间件应用程序有助于让事情变得更简单,那么这也肯定不会有任何问题。 这可能是一个解决方案,但 AFAIK 决定的批准将取决于您的上级。您可以提出这个想法或收到您必须使用 JNA 或 JNI 进行交互的命令。 您认为您可以指向一些链接,我可以在其中了解有关创建中间件应用程序的更多信息,或者,如果我仅限于 JNA/JNI,如何将 JNA/JNI 用于 .网?我真的在这里拍摄黑暗 - 在两个方面。 我认为您仅限于 WCF、WebService、HTTP 或原始 TCP 连接类型解决方案,正如您所说,.NET 客户端应用程序与服务器应用程序不在同一台机器上。 (我假设这是因为您说服务器在云中,并且客户端安装在某个地方。)而且在我看来,您需要服务器将值写入客户端软件,而不是让客户端软件启动与服务器的操作。是否有多个客户端安装,您是否必须在所有客户端上调用该函数? 【参考方案1】:

您可以将 VB.NET 公开为要在 Java 中使用的 Web 服务...

【讨论】:

这应该是评论而不是答案(请注意,我在评论中使用 WCF 服务对此进行了介绍)。 您能详细说明一下吗?如前所述,我只是一个了解非常有限的低级程序员......【参考方案2】:

在这种情况下,我永远不会使用 Web 服务。 COM/ActiveX 也应尽快跳过以避免进一步的问题;) JNA/JNI 听起来不错,但有很多隐藏的东西在你的路上。提议的 JNBridge 是个好主意,因为它使您有可能专注于您的核心问题,并且使用这种方法您只需将所有互操作性 (JNA/JNI) 任务交给第三方。

作为替代选项,我建议您检查 JNBridge 的轻型对应物,称为 Javonet。它不需要代理生成或安装任何插件。您只需获得一个 JAR 文件即可访问任何自定义 .NET DLL 和 .NET Framework,无需在 .NET 端进行任何更改。

性能非常高,几乎是原生的,并且可能涵盖 90% 的情况,例如:使用任何 .NET 对象、方法、字段、数组、泛型、事件、异常、数据类型转换等......

此外,此类桥梁的价格/价值指数如此之高,以至于在您只有一个要读取的属性或要执行的一种方法之前,开始定制开发永远不会有回报。否则我会选择第三方网桥。

Javonet 可与任何 .NET DLL 一起使用,包括 VB.NET、C# 等。查看使用 Java 语法从 JAVA 使用 .NET 的简短示例代码:

NObject yourObj = Javonet.New("Your.Namespace.YourDotNetClass");
yourObj.invoke("YourMethod","arg1",2);

正如您从 JAVA 端的 Javonet API 看到的,您会得到一个名为“NObject”的新对象,它是任何 .NET 对象的句柄类型,您可以在其上执行诸如调用方法、获取/设置字段和参数等操作,您可以提供为JAVA 类型 String、Integer、Float,它们会自动转换为 .NET 类型。

有关更多详细信息,请查看快速入门指南: http://www.javonet.com/#getting_started

【讨论】:

【参考方案3】:

我可以将 JNA 与 UnmanagedExports 一起推荐,因为它只需要带有以下 Header 的 C#、VB.NET 或 F# .dll

C#:

[RGiesecke.DllExport.DllExport]
public static String yourFunction(String yourParameter)

    return "CSharp String";

之后,您可以像使用 Java 中的任何其他 C 或 C++ .dll 一样使用 JNA 使用它。您可以在类似问题的回答中找到一个示例和一些我无法解决的限制:Call DLL from Java using JNA

我只用 C# 尝试过,但正如 docu 中所述,它应该适用于 C#、F# 和 VB.NET。

【讨论】:

以上是关于从 Java 调用 VB.NET 函数的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C++ 调用 VB.NET DLL(也调用函数 - 不仅仅是 DLL 文件)

vb.net 如何引用自定义类库

如何实例化一个 vba 类并从 vb.net 调用一个方法?

从后面的 vb.net 代码调用 javascript

vbscript 从vb.net后面的代码调用javascript函数

从VB.NET Web表单调用我的第一个WCF服务中的函数会引发错误。函数调用缺少WCF函数中的参数