【问题标题】:Changing a CORBA interface without recompiling在不重新编译的情况下更改 CORBA 接口
【发布时间】:2010-09-07 09:42:27
【问题描述】:

我想向现有服务器的 CORBA 接口添加一个方法。这需要重新编译所有客户端吗?

我正在使用 TAO。

【问题讨论】:

    标签: c++ corba idl tao


    【解决方案1】:

    不需要重新编译客户端(也不应该这样做,无论您使用什么 ORB)。正如 Adam 所指出的,查找是通过操作名称完成的(直接的文本比较)。

    我已经使用我们基于 ACE/TAO 的系统完成了您所描述的操作,并且没有遇到任何问题(服务器使用 ACE/TAO C++,客户端使用 ACE/TAO C++、使用 Borland 的 Janeva 和 OmniORBPy 的 C#)。

    【讨论】:

    • 我们一直这样做——在枚举的末尾添加方法甚至新值。它就像一个魅力!
    【解决方案2】:

    假设客户端和服务器通过 IIOP 进行通信,则不需要重新编译。 IIOP 消息包含接口名称、方法名称和参数。如果这些事情都没有改变,那么一切都应该保持兼容。向接口添加另一个方法不会改变任何现有的东西。

    另一方面,如果您的对象使用不同的协议,或者如果客户端与服务器处于进程中并因此绕过 IIOP,您可能需要确保所有内容都被重新编译。

    【讨论】:

      【解决方案3】:

      操作(方法)是按名称查找的,因此您只需重新编译使用新操作的客户端即可。

      【讨论】:

        【解决方案4】:

        使用托管的客户端(即在 ORB 中启用托管的同一进程中运行)必须重新编译。远程客户端可能保持不变 - 如前所述,方法通过符号名称匹配。

        【讨论】:

          【解决方案5】:

          这取决于新的 idl 方法的使用。 如果 Corba 调用是静态的(SII),这意味着您的客户端与存根链接,如果您想使用新添加的方法接口,则必须重新编译存根。

          如果 corba 调用是动态的 (DII),则客户端不需要存根。不需要重新编译。在这种情况下,您的客户端代码应如下所示:

               remoteObjRef->invoke("methodname", args); // send("methodname", args)
          

          四年前我进行了 CORBA DII 调用,它与 TAO 客户端和 TAO/Jacorb/IONA corba 服务一起使用。

          【讨论】: