3

私の C++ コードでは、コールバック関数は、より一般的な関数ポインター構造としてではなく、std::function() obj として表されます。

typedef std::function<void()> MYCALLBACK;

C++ のコールバック関数は、次の方法で設定されます。

MYCALLBACK myCBFunc; // some member variable
void SetCallbackFunction(MYCALLBACK cbFunc)
{
  myCBFunc = cbFunc;
}

C# で:

delegate void MyCallbackFunc(); // delegate matching the c++ callback sig

// method matching the call back sig
void foo()
{ }

[DllImport("mydll.dll")]
static extern SetCallbackFunction(MyCallbackFunc cbfunc);

// set the callback
MyCallbackFunc cb = foo;
SetCallbackFunction(cb); // crash here

コンパイルはOKですが、実行すると AccessViolationException でクラッシュします。私は当初、これは MYCALLBACK obj がスタック上にあり、参照渡しする必要があり、一致するように署名を変更する必要があるためだと考えていましたが、それでもクラッシュします。

MYCALLBACK myCBFunc; // some member variable
void SetCallbackFunction(MYCALLBACK& cbFunc)
{
  myCBFunc = cbFunc;
}

[DllImport("mydll.dll")]
static extern SetCallbackFunction(ref MyCallbackFunc cbfunc);

// set the callback
MyCallbackFunc cb = foo;
SetCallbackFunction(ref cb); // crash here

これを std::function() で動作させるにはどうすればよいですか? 普通の古い関数ポインタを使用しても問題ありません。

4

1 に答える 1