【问题标题】:Can a DLL be used with other Programming Languages?DLL 可以与其他编程语言一起使用吗?
【发布时间】:2016-11-15 07:02:15
【问题描述】:

什么编程语言可以支持同一个dll?

我刚买了一个捆绑了 3 个 api 的产品:JAVA、.NET、C++

在每个 api 文件夹中,我在 .Net 和 C++ 文件夹中找到了 dll 文件,而在 java 文件夹中找到了 jar 文件。我的问题是,我可以在不同语言上集成 dll 吗?我已经尝试使用 jni 在 java 中实现一个 dll 并且它有效。我读到 dll 支持多语言程序,但为什么 .net 和 c++ 使用不同的 dll?

任何答案将不胜感激。谢谢

【问题讨论】:

  • 没有。 DLL 是特定于 PL 的。在 Visual Studio 中,您拥有可用于其他基于 VS 的 PL 的 COM 对象。您可以使用具有客户端和服务器拓扑的套接字从一个程序到另一个程序。
  • 据我所知,很多语言(如 ruby​​、python、java、scala、php、lua ...)都可以使用这些 dll 文件,您需要为那个语言,我认为那个语言的介绍应该有一些关于这个问题的文档
  • 请看我的回答@seccpur。
  • @seccpur:调用以另一种语言编写的 DLL 的方式因语言而异 - 但能够这样做是非常常见的。 COM 没有什么特别神奇的地方。

标签: java c++ .net dll


【解决方案1】:

从 C#(或其他 .Net 语言)调用 C++ DLL 是完全可能的,但这样做是编写 P/Invoke 代码的问题(这很难)。

为方便起见,API 的作者为您编写了一个本地 C# 包装器,您可以像使用任何其他 C# 类一样使用它。

(以上假设“真正的”DLL 是 C++ 的 - 它实际上可能是 C# 的,而 C++ DLL 是用 C++/CLI 编写的包装器。实际上并没有太大改变逻辑。)

类似地编写 JNI 接口是乏味和繁琐的 - 最好只做一次(正确),而不是回答所有支持呼叫“我如何...”

【讨论】:

  • JNA 非常简单,可以调用 DLL 和 SO。
  • 所以意思是,即使产品的sdk只打包了一个,例如c++示例代码,使用它的dll,我仍然可以编写程序?我换个问题,有没有不能调用dll的编程语言?
  • @PeterLawrey:我从未遇到过我会形容为“简单”的外语界面。当然不像原生调用那么简单。
  • @MartinBonner JNA 比 JNI 简单得多(但也慢)。您在 Java 中创建一个接口并调用一个函数将其绑定到一个共享库。
【解决方案2】:

根据 2016 年 11 月 15 日的维基百科,

动态链接库(或 DLL)是 Microsoft 在 Microsoft Windows 和 OS/2 操作系统中实现的共享库概念。这些库通常具有文件扩展名 DLL、OCX(用于包含 ActiveX 控件的库)或 DRV(用于旧系统驱动程序)。 DLL 的文件格式与 Windows EXE 文件的格式相同,即 32 位和 64 位 Windows 的可移植可执行文件 (PE) 和 16 位 Windows 的新可执行文件 (NE)。与 EXE 一样,DLL 可以包含任意组合的代码、数据和资源。

这意味着您可以将包括代码在内的不同内容存储到 DLL 中。 DLL 在运行时加载。您可以根据语言支持的功能加载 DLL。
您可以通过以下方式做到这一点:-

  • 在 Java 中通过 JNI 接口。
  • C++
  • 使用任何其他支持调用 DLL 的语言。

需要注意的另一点是,DLL 必须事先针对您将调用它的操作系统进行编译。作为类比,不同的操作系统对 DLL 有不同的文件扩展名/概念。
例如,以下工作流程是有效的,
用 C++ 编译 DLL -> 存储在磁盘中 -> 从任何其他语言(如 C#)调用您的 DLL / C++/Java

【讨论】:

  • 如果我是技术工程师,客户问我“该产品是否适用于 PL”,只要说“是”就安全吗?它有 dll 吗?
  • 只要满足条件(你有办法在你的编程语言中导入和使用 DLL,并且 DLL 是为正确的操作系统编译的)你基本上没问题。唯一确定的方法是尝试编译使用 DLL 中给出的函数/代码的应用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多