0

我必须在 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 中找到了这篇文章,但与我想的不完全相同。

问候。

4

1 回答 1

0

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

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

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

于 2013-10-02T17:21:04.793 回答