如果有人问过,请接受我的歉意。我似乎无法在这个问题上找到太多。 Primitive types pass template parameter between c++ and CLI是一个类似的问题,我没有发现它非常有用。
我有一个本机C ++ DLL,它暴露了一个模板类(当然是它的实例化),我希望在C#中使用它的类比。我对C#比较新,但我知道最接近的是通用。
我的问题是如何将C ++模板包装在C ++ / CLI模板/ generic中,以便能够在C#中使用它。
甚至可能吗?我认为这是不可能的,因为CLI包装器不知道如何将非托管的未知类型T
编组为C#使用的托管类型。
如果有可能,你怎么做?如果没有,您可以在类似情况下使用哪些一般策略?
感谢。
答案 0 :(得分:2)
您声明模板类已经从DLL导出,这意味着它是一个实例化的模板类。
从P / Invoke的角度来看,实例化的C ++类与普通的C ++类没有区别。尽管手动编写包装器代码非常耗时,但可以直接从C#调用实例化的模板类,而无需使用C ++ / CLI。
我已经在C# pinvoke marshalling structure containg vector<structure>上分享了在stackoverflow上手动执行此操作的方法,但是这需要花费太多时间手动编写包装类,这可能不值得付出努力。
我写的工具xInterop NGen++可以为模板类生成C#包装类。只要可以从传统的C ++应用程序中使用相同的DLL,它就可以为从本机C ++ DLL导出的任何C ++类生成包装类。
您可能需要在我的博客网站上的以下链接中阅读详细信息。
Advanced technology to wrap native C++ template class in C# automatically
Creating and Accessing Instantiated std::vector Template Class from .NET
我确实计划在不久的将来免费发布快递版本,如果预算是你关注的话。因此,如果您有一个需要调用一些C ++模板类的小项目,那么您可以使用具有有限功能的免费版本来创建C#包装类。我还计划为几个开源C ++项目发布生成的C#包装器(C#绑定)。
(我是xInterop NGen++的作者)
答案 1 :(得分:1)
假设您正在谈论不受管理的C++
,那么这实际上是不可能的。
一般来说,将任何从非托管C ++复杂的东西传递给C#是一种正确的痛苦。
最简单的方法是在C ++中编写一个简单的结构,您可以使用它在托管代码和非托管代码之间传递数据。 (换句话说,数据传输对象。)
然后编写一个非托管函数(使用C
签名而不是名称错误的C++
签名)来封装C++
方法,并从C#调用该包装函数。
我已经完成了几次,并且比尝试从C#调用非托管C ++函数更易于管理!
答案 2 :(得分:0)
如果您愿意在C ++ / CLI包装器中为这些类型提供受支持的模板参数类型和托管的&lt; - &gt;非托管转换函数的明确列表,那么这是可行的。 See the code here.