C++ cli 将成员函数用于C样式回调时锁定委托
当为C风格回调使用成员函数时,是否需要固定委托,以便GC不会收集或移动它?我已经读了几篇关于这个主题的帖子,但还不能确定它是否有必要或正确的实施方式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
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
添加对委托的引用,这会阻止处置。然后你必须释放这个句柄,当你处理完它的时候
下面是一个很好的示例页面: