Мне нужно передать управляемый обратный вызов неуправляемому TCP-приемнику. Поскольку это поток, который должен существовать на протяжении всего времени существования приложения, мне нужно предотвратить его сборку мусора. Я везде читал, что закрепление указателей на функции не требуется, и GCHandle.Alloc сделает работу по предотвращению сборки мусора.
Но является ли это данностью? Я видел, что AppPool, в котором размещен этот код, дает сбой с нарушением прав доступа. Почему я не должен подозревать, что эта ошибка возникает из-за того, что указатель на функцию был собран мусором?
Этот пост подтверждает этот факт.
Обновление :Кажется, это значительно уменьшило количество сбоев. Есть ли проблема с этим подходом?
typedef void (__cdecl *ProcMessageFunc)(void* param, void* paramBuf, ULONG bufSize);
FuncDelegate^ fp = gcnew MessageFuncDelegate(this, &Handler);
pin_ptr pinnedFunctionPointer = &fp;
ret = Receiver ((ProcMessageFunc)pinnedFunctionPointer);