我正在使用Mono在C ++应用程序中嵌入C#,它有一个函数mono_add_internal_call
,用于从C#调用C / C ++。该函数接收一个函数指针,用于调用相应的C#函数时应调用的函数。
一个问题是,单声道运行时提供的某些类型与我在函数中使用的类型不同(例如MonoString*
而不是char*
),我正在寻找一种方法来创建一个适配器函数使用模板来抽象参数的类型转换和返回类型。
模板将检测我的函数的每个参数的类型,并返回一个将接收相应单声道参数的lambda。调用lambda时,它会转换类型(例如MonoString*
- > char*
),然后使用转换后的类型作为参数调用我的函数。
这样我就不需要为每个函数编写一个lambda,如下所示:
bool myFunc(const std::string& s, int n);
mono_add_internal_call("CSharpClass.myFunc", [](MonoString* s, int) {
myFunc(monoStrToChar(s));
});
我会做这样的事情:
customInternalCall("CSharpClass.myFunc", myFunc);
这也可以通过将指针作为C#代码中的第一个参数传递来调用对象实例中的函数。
EmbedType<MyClass> myType()
.customInternalCall("CSharpClass.myFunc1", myFunc1) //receives the ptr in the first arg then would call ptr->myFunc1()
.customInternalCall("CSharpClass.myFunc2", myFunc2);
我能够获得参数类型列表和函数的返回类型,但我是模板的新手,现在我被卡住了。
这可能吗?如果是这样,请提供一个例子。