管理対象コールバックをアンマネージドTCPレシーバに渡す必要があります。アプリケーションの存続期間中に存在する必要があるスレッドなので、ガベージコレクションが行われないようにする必要があります。私はどこにでも関数ポインタを固定する必要はなく、GCHandle.Allocはガベージコレクションを防止するという仕事をしています。関数ポインタをピンに固定
これは指定されていますか?私はこのコードをホストしているAppPoolがアクセス違反でクラッシュするのを見ました。関数ポインタがガベージコレクションされたためにこのエラーが発生するという事実は疑わしくありませんか?
このpostは、この事実をサポートしています。
更新: これはクラッシュを大幅に軽減したようです。このアプローチに問題はありますか?
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);
静的変数にデリゲートオブジェクトを格納するだけで十分です。ネイティブコードは、他の多くの理由でアクセス違反で爆弾攻撃を受けることがあります。 –
私はそれを正確にしました。ガベージコレクションが原因であると疑われる傾向にある理由は、アクセス違反が不規則に発生するためです。そしてもっと重要なのは、クラッシュダンプ内のコールスタックです。ネイティブdllとそれに続く、clr.dll、次にkernel32.dllがスタックの先頭に表示されます。この順序は一貫しています。 – Krishter