从 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 文件)
如何实例化一个 vba 类并从 vb.net 调用一个方法?