将模板类从 C++ 库导出到 VB.NET 和 C#

Posted

技术标签:

【中文标题】将模板类从 C++ 库导出到 VB.NET 和 C#【英文标题】:Export Template Class from C++ library to VB.NET and C# 【发布时间】:2012-09-18 13:59:18 【问题描述】:

我有以下问题:我用 C++ 创建了一个 DLL,其模板类定义如下:

 template <class T>
 class myClass 
    public:
    //! Constructor
    myClass(int size = 10);

    //! Destructor
    ~myClass();

    someAttributes ... ;
    

我想导出它,所以我定义如下:

   template class __declspec(dllexport) myClass<double>;

因为 - 我读过 - 在 Visual C++ 中,您不能导出模板,而只能导出它们的显式初始化。 这种方式一切正常,我可以在新的 Visual C++ 代码中导入 DLL。 现在:我是否必须为我需要的每种类型(myClass、myClass 等)导出显式实例化?还是有更好的方法 - 不那么天真 - 做到这一点? 如何在 VB.NET 项目中导入我的模板类?有办法吗?还是我必须创建一个编组结构,然后在运行时将其转换到我的模板类中?

谢谢大家!

【问题讨论】:

【参考方案1】:

您必须为您希望使用的每种类型导出模板的显式类型实例化。此外,您可能必须至少一次从 C++ 代码中调用要显式使用的每个方法,以便将其目标代码包含在库中。

这样做的原因是,模板代码不是很容易编译到您的目标文件(或 dll)中的代码。编译器将在您的程序编译时生成所需的(通常仅是所需的)代码。如果您的 C++ 代码从不使用模板类,编译器将完全忽略该模板。模板类的方法也是如此。如果不使用,允许编译器忽略。

底线是:对打算从其他语言使用的库使用模板代码通常不是一个好主意...

【讨论】:

谢谢!问题是我有一个类和很多方法。使用模板,我不需要为我需要使用的每种类型重写所有模板。您对其他方式有什么建议吗? 首先,您可以问问自己,您是否真的需要所有可能的类型的类实现...也许实际上您实际上只需要一种或两种类型。

以上是关于将模板类从 C++ 库导出到 VB.NET 和 C#的主要内容,如果未能解决你的问题,请参考以下文章

vb.net 导出PDF

C++ 模板类绑定到 nodejs

使用 VB.Net 将 excel 中的特定列值导出到数据网格

用C语言如何写DLL动态链接库?VB.net 又如何调用其生成的DLL库?急急急!!!!在线等!!

VS2017下创建C++动态库导出符合并完成调用测试(DLL可供C#调用)

VS2017下创建C++动态库导出符合并完成调用测试(DLL可供C#调用)