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 がメイン ラッパーを指している場合、オブジェクトがリークすることに注意してください。代わりに、含まれている 2 番目のヘルパー オブジェクトを使用してください。

于 2013-10-02T17:21:04.793 に答える