【问题标题】:What is IDL?什么是 IDL?
【发布时间】:2010-10-14 19:30:21
【问题描述】:

IDL 是什么意思?我google了一下,发现它代表接口定义语言,用于组件的接口定义。但是,在实践中,IDL 的目的是什么?微软使用它吗?

【问题讨论】:

标签: idl


【解决方案1】:

接口定义语言 (IDL) 用于在远程过程调用 (RPC) 中建立客户端和服务器之间的通信。这有很多变种,例如 Sun RPC、ONC RPC、DCE RPC 等等。

基本上,您使用 IDL 来指定客户端和服务器之间的接口,以便 RPC 机制可以创建跨网络调用函数所需的代码存根。

RPC 需要使用 IDL 信息为客户端和服务器创建存根函数。它与 C 中的函数原型非常相似,但最终结果略有不同,如下图所示:

+----------------+
| Client         |
|  +----------+  |         +---------------+
|  |   main   |  |         | Server        |
|  |----------|  |         |  +----------+ |
|  | stub_cli |----(comms)--->| stub_svr | |
|  +----------+  |         |  |----------| |
+----------------+         |  | function | |
                           |  +----------+ |
                           +---------------+

在这个例子中,main 不是在同一个程序中调用function,而是调用一个客户端存根函数(与function 具有相同的原型),它负责打包信息并通过网络获取它到另一个进程,通过 comms 通道。

这可以是同一台机器或不同的机器,这并不重要 - RPC 的优点之一是能够随意移动服务器。

在服务器中,有一个“侦听器”进程将接收该信息并将其传递给服务器。服务器的 stub 接收信息,将其解包并传递给真正的函数。

真正的函数然后做它需要做的并返回到服务器存根,它可以打包返回信息(返回代码和任何[out][in,out]变量)并将其传递回客户端存根。

客户端存根然后将其解包并将其传递回main

实际细节可能略有不同,但对于概念性概述来说,这种解释应该足够了。

实际的 IDL 可能如下所示:

[   uuid(f9f6be21-fd32-5577-8f2d-0800132bd567),
    version(0),
    endpoint("ncadg_ip_udp:[1234]", "dds:[19]")
] interface function_iface {
    [idempotent] void function(
        [in] int handle,
        [out] int *status
    );
}

顶部的所有信息(例如,uuidendpoint)基本上是用于连接客户端和服务器的网络信息。它的“肉”在显示原型的界面部分内。这允许 IDL 编译器构建 function 客户端和服务器存根函数,用于编译和链接您的客户端和服务器代码以使 RPC 正常工作。

微软确实使用 IDL(我认为他们有一个 MIDL 编译器)来处理 COM 的东西。我还使用了带有 MS 操作系统的第三方产品,包括 DCE 和 ONC RPC。

【讨论】:

  • 他们确实有一个 MIDL 编译器。它被称为midlc。哈哈。
  • midlc 而不是 c#? :-) 只有音乐家才能理解这种幽默,尽管它很蹩脚。
【解决方案2】:

还有Interactive Data Language,我曾在一份工作中使用它来进行科学数据分析,但也许从上下文来看,您很清楚这不是 IDL 所代表的含义。

【讨论】:

    【解决方案3】:

    IDL 是Interface Definition Language 的首字母缩写词,根据定义该语言的供应商或标准组,它有多种变体。 IDL 的目标是描述某些服务的接口,以便希望使用该服务的客户知道该服务提供了哪些方法和属性、接口。 IDL 通常与二进制接口一起使用,IDL 语言文件描述了二进制接口中使用的数据类型。

    二进制组件有几种不同的标准,通常是COTS or Commercial Off The Shelf,并且客户端与二进制组件通信的方式可能会有所不同,尽管传统上使用的是Remote Procedure Call or RPC 的某些版本。两个这样的标准是Microsoft Common Object Model or COM standardCommon Object Request Broker or CORBA standard。还有其他组件标准,例如 Firefox plugins 或其他应用程序的插件,例如 Visual Studio 本身,但是这些不一定使用某种形式的接口描述语言,而是使用某种具有标准化和众所周知的接口的软件开发工具包或 SDK到 API。

    IDL 允许更大程度的灵活性,能够创建提供各种服务的组件,由于它们的二进制性质,这些服务可以与各种不同的编程语言和各种不同的环境一起使用。

    Microsoft 对 COM 对象使用 IDL 方言,并且 Microsoft IDL 与 CORBA IDL 不同,尽管它们有相似之处,因为它们共享共同的语言根。 IDL 文件包含 COM 对象支持的接口的描述。 COM 允许创建进程内服务(可能使用 RPC,或直接 DLL 调用)或进程外服务(使用 RPC)。 COM 背后的想法是客户端只需要知道组件的标识符以及能够使用它的接口。客户端请求 COM 对象,然后从 COM 对象的工厂请求一个类对象,该类对象支持客户端想要使用的接口,然后通过该接口使用 COM 对象。

    Microsoft 提供 MIDL 编译器,它处理 IDL 文件以生成类型库,向 COM 对象的用户提供有关接口的信息,以及跨客户端和服务之间的接口封送数据的必要存根。

    数据编组基本上意味着存根获取客户端提供的数据,将其打包并将其发送到执行某些操作并将数据发送回的服务。这种数据的发送和接收可能是通过一些 RPC 服务或通过直接的 DLL 函数调用。来自服务的响应被翻译成适合客户端的形式,然后提供给客户端。所以基本上封送功能是客户端和服务之间的adapter (see the adapter design pattern)bridge (see the bridge design pattern)

    Visual Studio,我的经验是使用 C++,包含许多可用于生成示例的向导,以便您可以使用它。如果您有兴趣可以创建一个工作空间,然后在工作空间中创建一个 ATL 项目来生成控件,然后创建一个简单的 MFC 对话框项目来测试它。为您的 COM 控件使用 ATL 隐藏了很多您可以稍后调查的细节,而简单的 MFC 对话框项目提供了一种创建容器的简单方法。您还可以使用 Visual Studio 中提供的 ActiveX 控件测试容器工具进行初步测试并查看方法和属性的工作方式。

    在 codeproject.com 等网站上也有许多示例项目。例如这里是one using C to expose all the ugly plumbing behind COM,这里是one using C++ without ATL

    【讨论】:

      【解决方案4】:

      它是一种在 COM 时代被用来以(假设)语言中立的方式定义接口的语言。

      【讨论】:

      • 感谢“语言中立”的评论。你能分享在 Java 中使用 IDL 的例子吗?
      【解决方案5】:

      它定义了用于与另一个应用程序中的公开服务通信的接口。

      如果您使用 SOAP,您就会了解 WSDL。 WSDL 是 IDL 的另一种形式。 IDL 通常指 Microsoft COM 或 CORBA IDL。

      【讨论】:

        【解决方案6】:

        IDL 在 2 种情况下至关重要。 1. 为 exe 服务器创建代理/存根 dll。 2. 为自动化服务器创建类型库。

        link有一篇非常好的 IDL 基础文章

        要学习 IDL,最好阅读编译器自己的 idl 头文件,这些头文件给出了 VC++ 包的 include 子目录。

        【讨论】:

        • 虽然这在理论上可以回答这个问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-22
        • 2013-10-24
        • 1970-01-01
        • 1970-01-01
        • 2012-09-03
        • 2012-11-26
        • 2021-08-06
        相关资源
        最近更新 更多