我正在开发一种软件,其核心,插件和GUI模块化分离。我按需动态加载模块。
我需要确定哪种类型的内部通信最适合以这种方式模块化的软件,以便不同的部分可以交换事件和信息,考虑到使用不同工具包的插件或GUI最终将由第三方开发方。
现在我考虑过简单地从共享对象中加载符号,并在知道其类型和功能签名的情况下使用它们。我也考虑使用类似DBus的IPC,但我不确定这是否过度或完全没必要。
现在,跨平台并不是一个很大的问题,但可能会在未来。
一方与另一方的利弊是什么?有什么其他解决方案可以考虑我没有找到吗?
答案 0 :(得分:2)
对于在进程中加载的组件,IPC过度。当调用者和被调用者可以直接共享指针时,所有关于缓冲区大小和复制方向的额外注释都是不必要的。
如果您想迁移到Windows,请考虑共享库可能具有不同的分配器和不同的类布局。最好的办法是导出一个工厂函数,返回一个指向接口的指针(抽象类只有纯虚拟成员函数,没有数据,数据和实现都在子类中),让对象自由(其中一个)虚拟成员函数会破坏它。)
例如,您可以查看COM IUnknown
。您不需要所有复杂的界面查询等等,但使用纯虚函数和引用计数是一种非常灵活,可扩展性极强且极易移植的模式。