0

如果有人问过这个问题,请接受我的道歉。我似乎找不到太多关于这个主题的东西。原始类型在 c++ 和 CLI 之间传递模板参数是一个类似的问题,我觉得它的信息量不大。

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

我的问题是如何将 C++ 模板包装在 C++/CLI 模板/泛型中,以便能够在 C# 中使用它。

  1. 甚至可能吗?我认为这是不可能的,因为 CLI 包装器不知道如何将非托管的未知类型编组为托管T类型以供 C# 使用。

  2. 如果有可能,你会怎么做?如果不是,您可以在类似情况下使用哪些一般策略?

谢谢。

4

3 回答 3

1

假设您在谈论非托管C++,那么这实际上是不可能的。

一般来说,将任何复杂的东西从非托管 C++ 传递到 C# 都是一种痛苦。

最简单的做法是用 C++ 编写一个简单的结构,您可以使用它在托管代码和非托管代码之间传递数据。(换句话说,一个数据传输对象。)

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

我已经这样做了几次,它比尝试从 C# 调用非托管 C++ 函数要容易得多!

于 2013-06-28T11:21:21.287 回答
1

您说模板类已经从 DLL 中导出,这意味着它是一个实例化的模板类。

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

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

我写的工具,xInterop NGen++可以为模板类生成C#包装类。它可以为从本地 C++ DLL 导出的任何 C++ 类生成包装类,只要可以从传统 C++ 应用程序中使用相同的 DLL。

您可能想在我的博客网站上的以下链接中阅读详细信息。

在 C# 中自动包装原生 C++ 模板类的先进技术

从 .NET 创建和访问实例化的 std::vector 模板类

如果您担心预算,我确实计划在不久的将来免费发布快速版本。因此,如果您有一个需要调用几个 C++ 模板类的小项目,您也许可以使用功能有限的免费版本来创建 C# 包装类。我还计划为几个开源 C++ 项目发布生成的 C# 包装器(C# 绑定)。

(我是xInterop NGen++的作者)

于 2013-08-02T04:11:26.950 回答
0

如果您愿意在 C++/CLI 包装器中为这些类型提供支持的模板参数类型和托管<->非托管转换函数的显式列表,这是可行的。请参阅此处的代码。

于 2013-08-02T12:06:55.117 回答