我必须在CLI中包装一些本机类 但我对如何在其包装器中覆盖它们的虚方法有疑问。 因此,假设有一个带有虚方法的本机类:
class NativeClass {
virtual void VMethod(std:string text) {
...
}
};
你想用托管类包装它...我想做这样的事情:
#pragma unmanaged
class NativeWrapper : public NativeClass {
public:
typedef void (*VMethodFunc)(std::string);
NativeWrapper(VMethodFunc VMethodFuncPtr)
: m_VMethodFuncPtr(VMethodFuncPtr) {}
void VMethod(std::string text) {
m_VMethodFuncPtr(text);
};
private:
VMethodFunc m_VMethodFuncPtr;
};
#pragma managed
ref class ManagedWrapper {
public:
// To Override
virtual void VMethod(String^ text) {
Console.WriteLine(text);
};
private:
void VMethod(std::string text) {
String^ sErr = gcnew String(text.c_str());
VMethod(sErr);
};
};
但是如何将ManagedWrapper :: VMethod(std :: string)“绑定”到VMethodFunc函数指针? 我在MSDN中找到了this article,但我想的并不完全相同。
问候。
答案 0 :(得分:0)
几乎完全正确,但您应该使用gcroot和委托类型而不是本机函数指针。
也可以使用GetFunctionPointerForDelegate函数,但这可能会导致生命周期问题。
请注意,如果gcroot指向将导致对象泄漏的主包装器。请改用第二个包含的辅助对象。