マネージド コールバックをアンマネージド TCP レシーバーに渡す必要があります。アプリケーションの存続期間中に存在する必要があるスレッドであるため、ガベージ コレクションが発生しないようにする必要があります。関数ポインターをピン留めする必要はなく、GCHandle.Alloc がガベージ コレクションを防止するということをどこでも読んだことがあります。
しかし、これは与えられたものですか?このコードをホストしている AppPool がアクセス違反でクラッシュすることを確認しました。関数ポインターがガベージ コレクトされたためにこのエラーが発生するという事実を疑わないのはなぜですか?
この投稿は、この事実を裏付けています。
更新: これにより、クラッシュが大幅に減少したようです。このアプローチに問題はありますか?
typedef void (__cdecl *ProcMessageFunc)(void* param, void* paramBuf, ULONG bufSize);
FuncDelegate^ fp = gcnew MessageFuncDelegate(this, &Handler);
pin_ptr<MessageFuncDelegate^> pinnedFunctionPointer = &fp;
ret = Receiver ((ProcMessageFunc)pinnedFunctionPointer);