我想向现有服务器的 CORBA 接口添加一个方法。这需要重新编译所有客户端吗?
我正在使用TAO。
不需要重新编译客户端(也不应该这样做,无论您使用什么 ORB)。正如 Adam 所指出的,查找是通过操作名称完成的(直接的文本比较)。
我已经使用我们基于 ACE/TAO 的系统完成了您所描述的工作,并且没有遇到任何问题(服务器使用 ACE/TAO C++,客户端使用 ACE/TAO C++,使用 Borland 的 Janeva 和 OmniORBPy 的 C#)。
假设客户端和服务器通过 IIOP 进行通信,则不需要重新编译。IIOP 消息包含接口名称、方法名称和参数。如果这些事情都没有改变,那么一切都应该保持兼容。向接口添加另一个方法不会改变任何现有的东西。
另一方面,如果您的对象使用不同的协议,或者如果客户端与服务器处于进程中并因此绕过 IIOP,您可能需要确保所有内容都被重新编译。
操作(方法)是按名称查找的,因此您只需要重新编译使用新操作的客户端即可。
使用托管的客户端(即在 ORB 中启用托管的同一进程中运行)必须重新编译。远程客户端可能保持不变——如前所述,方法通过符号名称匹配。
这取决于新 idl 方法的使用。如果 Corba 调用是静态的(SII),这意味着您的客户端与存根链接,如果您想使用新添加的方法接口,则必须重新编译存根。
如果 corba 调用是动态的 (DII),则客户端不需要存根。不需要重新编译。在这种情况下,您的客户端代码应如下所示:
remoteObjRef->invoke("methodname", args); // send("methodname", args)
四年前我进行了 CORBA DII 调用,它与 TAO 客户端和 TAO/Jacorb/IONA corba 服务一起使用。