【问题标题】:Best way to "override" native virtual method in a managed wrapper在托管包装器中“覆盖”本机虚拟方法的最佳方法
【发布时间】:2013-10-02 15:25:15
【问题描述】:

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

问候。

【问题讨论】:

  • 我不太明白你想在这里做什么。您是否希望 ManagedWrapper 提供一个简单地委托给 NativeClass::VMethod 的虚拟 VMethod(String^ text)?
  • 使用构造函数创建NativeClass的实例,在析构函数和终结器中再次销毁。
  • 嗨@NathanMonteleone,是的,这正是我想做的。
  • @HansPassant 我不认为这是重复的,这里我不是在问如何创建包装器,而是如何将托管方法绑定到本机方法。

标签: c++ c++-cli


【解决方案1】:

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

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

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

【讨论】:

  • 嗨@BenVoigt 感谢您的回复。您的意思是在本机类中使用委托类型?你能给我一个小例子(或链接)吗?
猜你喜欢
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 2014-03-18
  • 1970-01-01
  • 2012-10-26
  • 2020-08-31
相关资源
最近更新 更多