Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
包装非托管C++;C+中的模板+/C#/.NET使用的CLI_C#_C++_.net_Templates_C++ Cli - Fatal编程技术网

包装非托管C++;C+中的模板+/C#/.NET使用的CLI

包装非托管C++;C+中的模板+/C#/.NET使用的CLI,c#,c++,.net,templates,c++-cli,C#,C++,.net,Templates,C++ Cli,如果有人这样问,请接受我的道歉。关于这个问题,我似乎找不到多少。这是一个类似的问题,但我觉得它的信息量不大 我有一个本地C++的DLL,它公开了一个模板类(当然是实例化),我想在C语言中对它进行一个类似的模拟。我对C#比较陌生,但我知道最接近的是泛型 我的问题是如何在C++/CLI模板/通用程序中封装C++模板,以便在C语言中使用它。 有可能吗?我认为这是不可能的,因为CLI包装器不知道如何将非托管的未知类型t打包成托管类型以供C#使用 如果可能的话,你怎么做?如果没有,在类似情况下,您可以使用

如果有人这样问,请接受我的道歉。关于这个问题,我似乎找不到多少。这是一个类似的问题,但我觉得它的信息量不大

我有一个本地C++的DLL,它公开了一个模板类(当然是实例化),我想在C语言中对它进行一个类似的模拟。我对C#比较陌生,但我知道最接近的是泛型

我的问题是如何在C++/CLI模板/通用程序中封装C++模板,以便在C语言中使用它。
  • 有可能吗?我认为这是不可能的,因为CLI包装器不知道如何将非托管的未知类型
    t
    打包成托管类型以供C#使用

  • 如果可能的话,你怎么做?如果没有,在类似情况下,您可以使用哪些一般策略


  • 谢谢。

    假设你说的是非托管的
    C++
    ,那就不可能了

    一般来说,把任何从非托管C++传递到C语言的复杂事物都是一种痛苦。 <>最简单的方法是编写C++中的简单结构,可以在托管代码和非托管代码之间传递数据。(换句话说,是一个数据传输对象。)

    然后编写一个非托管函数(使用
    C
    签名而不是名称损坏的
    C++
    签名),该函数包装
    C++
    方法,并从C#调用该包装函数


    我已经做了几次,它比试图从C++中调用非托管C++函数更容易管理。p> 您声明模板类已经从DLL导出,这意味着它是一个实例化的模板类

    实例化C++类与P/Unc++视图的规则C++类没有区别。直接从C#调用实例化的模板类是可行的,无需使用C++/CLI,尽管手动编写包装器代码将非常耗时

    我已经在上分享了在stackoverflow上手动执行此操作的方法,但是以这种方式手动编写包装器类将花费您太多的时间,这可能不值得付出努力

    我编写的工具可以为模板类生成C#包装器类。它可以为从本地C++输出的任何C++类生成包装类,只要可以从传统的C++应用程序中使用相同的DLL。 您可能想在我的博客网站上的以下链接中阅读详细信息

    我有一个计划,在不久的将来免费发布一个快速版本,如果预算是你关心的。因此,如果您有一个小项目,需要调用几个C++模板类,您可能可以使用具有有限特性的免费版本来创建Cys*包装器类。我也有计划为两个开放源码的C++项目发布生成的C语言包装(C绑定)。
    (我是)

    如果您愿意在C++/CLI包装中为这些类型提供支持的模板参数类型和managedunmanaged转换函数的显式列表,那么这是可行的

    谢谢你的回复!是的,这是非托管C++,我在谈论(我在编辑中澄清了这一点)。所以在你的解决方案中,你完全绕过了托管C++包吗?@ KRISTANDAN' AMAMODY,是的,在我的代码中,我用C函数包住了所有C++的东西,并将复杂C++类中的必要数据复制到非常简单的C结构中。C++模板在编译时被实例化。从托管代码中使用它们的唯一可能方法是让它运行C++编译器。当然,这是不实际的。在C++/CLI中使用generic关键字来声明在运行时实例化的泛型类型。我一直在为我们公司评估此工具,并对其覆盖范围和满足的用例数量印象深刻。一个非常好的产品,如果您有大量的投资在C++中,并且需要能够消费它从C.V/VB.NET应用程序。