将成员函数用于 C 样式回调时固定委托

Posted

技术标签:

【中文标题】将成员函数用于 C 样式回调时固定委托【英文标题】:Pin a delegate when using a member-function for a C-Style callback 【发布时间】:2013-05-16 23:41:55 【问题描述】:

当为 C 风格回调使用成员函数时,是否需要固定委托以使其不被 GC 收集或移动?我已阅读有关该主题的几篇文章,但无法确定是否有必要或正确的实施方式。

public delegate void FeedCallbackDelegate(int type,void* data,void *param);

public ref class CStyleApiWrapper


    public:

    void StartFeed();

    private:

    FeedCallbackDelegate^ managedFeedCallback;
    IntPtr unmanagedFeedCallbackPtr;

    void FeedCallback(int code,int type,void* data,void *param);

;


void CStyleApiWrapper::StartFeed()


    managedFeedCallback = gcnew managedFeedCallback(this, &CStyleApiWrapper::FeedCallback);
    unmanagedFeedCallbackPtr = Marshal::GetFunctionPointerForDelegate(managedFeedCallback);

    //Start Feed
    StartFeed((NOTIFY_FUNC)(void*)unmanagedFeedCallbackPtr,0,NULL);



void CStyleApiWrapper::FeedCallback(int type,void* data,void *param)

    //Process Feed
    ...

【问题讨论】:

【参考方案1】:

仅调用 GetFunctionPointerForDelegate 不足以阻止 GC 回收您的委托。你必须 Alloc 一个带有 GCHandle.Alloc 的句柄。 Alloc 添加对委托的引用,以防止处置。然后你必须Free 处理完成后处理它。

这是一个很好的示例页面:http://msdn.microsoft.com/en-us/library/367eeye0%28v=VS.100%29.aspx。

【讨论】:

以上是关于将成员函数用于 C 样式回调时固定委托的主要内容,如果未能解决你的问题,请参考以下文章

没有可行的重载'='用于将std :: function回调赋值为成员函数

C++14 或 C++1z 是不是已经或将不再定义调用委托类成员函数指针?

如何实现类的成员函数作为回调函数

C++中类成员函数作为回调函数

如何使用 C++ lambda 将成员函数指针转换为普通函数指针以用作回调

如何使用 C++ 成员函数作为 C 框架的回调函数