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

C++ cli 将成员函数用于C样式回调时锁定委托,c++-cli,C++ Cli,当为C风格回调使用成员函数时,是否需要固定委托,以便GC不会收集或移动它?我已经读了几篇关于这个主题的帖子,但还不能确定它是否有必要或正确的实施方式 public delegate void FeedCallbackDelegate(int type,void* data,void *param); public ref class CStyleApiWrapper { public: void StartFeed(); private: FeedCal

当为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
    ...
}

仅调用
GetFunctionPointerForDelegate
不足以阻止GC回收您的委托。您必须在代理上使用
GCHandle.Alloc
句柄
Alloc
添加对委托的引用,这会阻止处置。然后你必须
释放
这个句柄,当你处理完它的时候

下面是一个很好的示例页面: