我需要将托管回调传递给非托管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