Закрепить указатель функции

Мне нужно передать управляемый обратный вызов неуправляемому 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);

8
задан Community 23 May 2017 в 12:10
поделиться