在使用c风格回调的成员函数时,固定委托

  • 本文关键字:函数 成员 风格 回调 c++-cli
  • 更新时间 :
  • 英文 :


当使用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来处理AllocAlloc添加了对委托的引用,从而防止了处理。然后你必须Free处理,当你完成它。

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

最新更新