【发布时间】:2012-07-09 17:58:51
【问题描述】:
我需要将托管回调传递给非托管 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。这个顺序是一致的。