0

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
    ...
}
4

1 に答える 1

1

呼び出すだけでGetFunctionPointerForDelegateは、GC がデリゲートを回収しないようにするのに十分ではありません。デリゲート Allocを処理する必要があります。破棄を防ぐデリゲートへの参照を追加します。次に、作業が完了したら、そのハンドルを使用する必要があります。GCHandle.AllocAllocFree

良い例のページは次のとおりです: http://msdn.microsoft.com/en-us/library/367eeye0%28v=VS.100%29.aspx

于 2013-05-17T00:51:38.513 に答える