我们的行业是高性能的分布式并行计算。我们使用Visual Studio 2008开发了一个非托管C ++应用程序。
我们的应用程序(更像框架)应该能够动态加载由第三方开发的代码(算法)(可以有许多dll)符合我们的接口规范,并调用加载的代码来获得一些结果。
把它想象成你想调用sin(x)函数,但是你可以使用sin(x)的许多不同实现。
我有几个问题,因为我对动态加载代码的这个领域很陌生:
答案 0 :(得分:3)
1)一般来说,是的。如果API变得复杂且多对象,我会使用COM或类似的机制。但是如果你只需要管理一个小状态,或者可以完全无状态,那么纯DLL接口就可以了。
2)使用合适的调用约定(stdcall)和数据类型。我甚至不认为实现必须在C ++中。所以这意味着char / wchar_t,显式大小的int,例如int32,float和double,以及它们的C风格数组。
3)不能说
4) 没有跨境内存分配:免费分配,让插件免费分配。
您的API设计对可实现的性能和实施工作有很大影响。不要使函数变小,给实现一些自由处理某些事情,定义错误协议,线程要求等。
<强> [编辑] 强>
此外,如果您声明结构,请查看对齐和编译器选项来控制它(通常是#pragma pack)。这是必需的,因此客户可以看到相同的布局。
编译器通常会“修改”导出符号的名称(例如,为STDCALL约定添加udnerscore)。通常,这是通过传递给链接器的.def文件来控制的。
答案 1 :(得分:1)
答案 2 :(得分:0)
根据我的经验,QLibrary是您问题的最佳答案。 它提供了一个简单的界面,并负责所有特定于平台的细节。 实际上,这意味着插件也必须使用QT编写。