在我的 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
编译正常,但运行时因 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() 一起工作?使用普通的旧函数指针没有问题。