关于跨dll边界的类和函数的堆栈溢出已经存在几个问题。
他们中的很多人都参考了这篇文章https://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL
我想深入了解一些并提出更具体的问题。
大多数问题的摘要是 1)在dll边界上导出模板和STL一般都很糟糕 2)您不能在dll边界的一侧分配并在另一侧释放。 3)你的选择是 a)仅导出纯C接口 b)导出可以在其内部实现中自由使用模板化和STL的抽象类。
确定。好吧,我在编写C ++的10年里从来没有这样做过,而且它从来没有把我扼杀在屁股上。我已经按照文章所说的那样和#34;天真的方法。"但是,我怨恨被称为天真一点点:),因为我在每个解决方案中始终拥有100%的源代码,并且始终使用相同的编译器和设置构建100%的源代码,并且一直注意到这一点。
最近,我收集了证据证明我在一个dll边界的一侧分配了一个对象并在另一个边缘释放了一个问题。所以,我可能会发现自己不得不改变自己的方式。也许,这是现在使用Nuget的第三方库的结果,而不是从源代码编译它们。
所以,我想知道,在域对象(或者在我的情况下,没有功能的对象)中如何使用这些选项
如果我永远不能使用std :: string,那么我假设导出的所有内容必须使用c风格的字符串,并且在我的解决方案中复制文本MB的数量增加了500倍,如果我想在内部使用std:string我的dlls。
更糟糕的是,我在思考这个问题:你如何拥有包含集合的域对象?
在我的" naive dll"
中考虑一个班级class CustomerList
{
public:
// where this is not trivial
void AddCustomer(const Customer & customer);
private:
std::vector<Customer> m_customers;
};
和我的dll中的函数或方法
SubmitCustomers(const CustomerList & customers);
如何使这个安全? 我是否需要在没有分配的情况下在纯C中重新发明矢量? 我是否必须使用大小的数组?呸?然后在内部更多地复制到STL容器?