在托管包装器中“覆盖”本机虚方法的最佳方法

时间:2013-10-02 15:25:15

标签: c++ c++-cli

我必须在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,但我想的并不完全相同。

问候。

1 个答案:

答案 0 :(得分:0)

几乎完全正确,但您应该使用gcroot和委托类型而不是本机函数指针。

也可以使用GetFunctionPointerForDelegate函数,但这可能会导致生命周期问题。

请注意,如果gcroot指向将导致对象泄漏的主包装器。请改用第二个包含的辅助对象。