我需要將託管回調傳遞給非託管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);
將委託對象存儲在一個靜態變量中就足夠了。由於其他原因,原生代碼可能會因訪問違規而爆炸。 – 2012-07-09 18:08:15
我已經完成了。我傾向於懷疑垃圾回收是原因的原因是訪問違規發生的不正常。更重要的是崩潰轉儲中的調用堆棧,我可以看到本機dll,隨後是clr.dll,然後是堆棧頂部的kernel32.dll。這個順序是一致的。 – Krishter 2012-07-10 02:28:49