使用成员函数进行C-Style回调时,是否需要固定代理以便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
...
}
答案 0 :(得分:1)
仅仅调用GetFunctionPointerForDelegate
不足以阻止GC回收您的委托。您必须在代理上Alloc
GCHandle.Alloc
处理Alloc
句柄。 Free
添加了对委托的引用,这会阻止处置。然后,当你完成它时,你必须处理{{1}}。
以下是一个很好的示例页面:http://msdn.microsoft.com/en-us/library/367eeye0%28v=VS.100%29.aspx。