Muszę przekazać zarządzane wywołanie zwrotne do niezarządzanego odbiornika TCP. Ponieważ jest to wątek, który musi istnieć przez cały czas trwania aplikacji, muszę uniemożliwić gromadzenie śmieci. Przeczytałem wszędzie, że wskaźniki funkcji przypinania nie są wymagane, a GCHandle.Alloc wykona zadanie zapobiegania zbieraniu śmieci.Przypnij wskaźnik funkcji
Ale czy to jest dane? Widziałem, że AppPool obsługujący ten kod ulega awarii z naruszeniem dostępu. Dlaczego nie powinienem podejrzewać, że ten błąd występuje, ponieważ wskaźnik funkcji został zebrany śmieci?
Ta post obsługuje ten fakt.
Aktualizacja: Wydaje się, że znacznie zmniejszyło to liczbę wypadków. Czy jest jakiś problem z tym podejściem?
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);
Przechowywanie obiektu uczestnika w zmiennej statycznej jest wystarczające. Kod macierzysty może bombardować naruszeniami dostępu z wielu innych powodów. –
Zrobiłem dokładnie to. Powodem, dla którego mam skłonność do podejrzeń, że wywóz śmieci jest taki, jest to, że naruszenie zasad dostępu występuje nieprawidłowo. Co ważniejsze, stos wywołań w zrzucie awaryjnym widzę natywną bibliotekę dll, po której następuje clr.dll, a następnie kernel32.dll na szczycie stosu. Ta kolejność jest spójna. – Krishter