向 C# 公开 C++/CLI 模板化包装器
expose c++/CLI templated wrapper to c#
我目前正在开发一个可视化编辑器来构建有限状态机。核心是 c++,因为构建的 FSM 将在游戏中运行。编辑器是 c#。我能够使用一个 CLI 包装器,这样我就可以在 c# 端构建我需要的一切。我尝试做的最后一件事是能够向 c# 公开模板化类。
我首先创建了一个托管类:
template <typename T>
public ref class TestTemp
{
private:
ClassToWrap<T>* m_val;
public:
TestTemp(T val) :
{
m_val = new ClassToWrap<T>();
}
}
然后,由于模板是在编译时生成的,因此我强制生成具有模板专用化的类型。
template ref class FSMWrapper::TestTemp<float>;
我尝试在几个地方进行专业化,cpp,header,也是为了以防万一,我什至尝试了main中的特定实例化,如下所示:
FSMWrapper::TestTemp<float> t(10.0f);
我什至试图明确地告诉导出符号,就像我在常规 c++ 中所做的那样,但编译器抱怨我无法使用托管类型执行此操作。
在所有这些之后,我没有设法让符号出现在 c# 命名空间中(其他所有内容都出现了,所以是的,包装器按预期工作)。
另外,如果我删除包装器中的模板并仅将其称为 TestTempFloat 并在内部强制对 float 进行实例化,它可以工作。
public ref class TestTempFloat
{
private:
ClassToWrap<float> m_val;
public:
TestTempFloat(float val) :
{
m_val = new ClassToWrap<float>();
}
};
我想做什么,甚至可能吗?通过谷歌搜索看起来是这样,但人们只是说,将其包装在 CLI 类型中并强制生成符号。如果可能的话,我做错了什么?
如果不可能,我只需要手动进行专门的包装,不漂亮,但我知道它有效。
我还尝试将其包装在泛型而不是模板中,但随后我无法将 T 泛型类型作为模板类型提供。
PS:我知道没有析构函数来释放内存,这只是一个虚拟测试,以保持示例简短。
如您所见,托管模板无法在它们所在的程序集之外访问。基本上,这个想法是将托管模板公开为可以跨程序集边界发送的泛型接口。
所以在你的情况下,你会想要创建一个ITestTemp
,像这样的东西......
generic<typename T> public interface class ITestTemp
{
public:
TestTemp(T val);
}
这是您将跨程序集导出的接口。现在,您必须将托管模板转换为该通用接口才能使用继承,具有以下签名的内容(为简单起见,省略内部)
templace<typename T> ref class TestTemp : ITestTemp<T>
一旦你现在有了它,你将不得不做"编译器的工作"(通常只是自动处理常规C++模板),以便它在两者之间转换。因此,您必须创建一个工厂方法,该方法将创建您要查找的特定实例。它看起来像这样
public ref class TestTempFactory
{
public:
generic<typename T> static ITestTemp<T>^ Create()
{
if (T::typeid == String::typeid)
{ return (ITestTemp<T>^) gcnew TestTemp<String>(); }
//more cases as needed...
}
}
我希望这能很好地解释它,如果不让我知道的话。
如果你实现了模板类的一个完整的子类,那应该可以解决问题。您将需要实现所有构造函数,但只是作为基类构造函数的传递;没有实际代码。
public ref class TestTempFloat : TestTemp<float>
{
TestTempFloat(float val) : TestTemp(val) { };
};
如果你有很多这样的,你可以使用预处理器:
#define IMPLEMENT_TESTTEMP(namesuffix, type)
public ref class TestTemp ## namesuffix : TestTemp<type>
{
TestTemp ## namesuffix(type val) : TestTemp(val) { };
};
IMPLEMENT_TESTTEMP(Float, float)
IMPLEMENT_TESTTEMP(Double, double)
IMPLEMENT_TESTTEMP(Int, int)
- 如何为要在 C# 中使用的静态库创建 C++ 或 C++/CLI 包装器
- 用于LabView中使用的本机c++的c++/cli dll包装器
- c++\CLI dll包装器,用于调用c++类中的虚拟成员
- 无法使用c++/cli包装从c#dll加载函数
- 使用 C++/CLI 包装器将 2D 数组从 C# 传递到非托管C++
- Visual Studio:C++\CLI 包装程序集路径依赖性问题
- C++/CLI 包装器不能使用来自本机C++ dll 的矢量
- 使用C /CLI包装器DLL时缺少功能
- C# 中与 CLI 包装器通信C++未处理的异常
- 将互操作 HwndSource 包装在 c++/cli 中,以用于本机 c++/MFC 应用程序
- 访问 C++/CLI 包装器中的私有C++方法
- 如何编写包装类以将 Qt 信号映射到 C# 事件(通过 C++/CLI)
- 将 C# 委托传递给 C++/CLI 包装器
- 为 GFLW 编写 C++/CLI 包装器
- Visual C#在调用包装的C++CLI dll中的Lapack时引发System.AccessViolation
- C++/CLI 包装器LNK2028和LNK2019错误
- 指针成员的 C++/CLI 包装器 - C++ 单例实例
- 指向指针 C++/CLI 包装器的指针
- 向 C# 公开 C++/CLI 模板化包装器
- 从 CLI 包装器检索本机对象