Yönetilmeyen bir geri çağrıyı yönetilmeyen bir TCP alıcısına iletmem gerekiyor. Uygulamanın ömrü boyunca bulunması gereken bir iş parçacığı olduğundan, toplanan çöpleri almasını engellemem gerekiyor. Her yerde, işlev işaretleyicilerini sabitlemenin gerekli olmadığını ve GCHandle.Alloc'un çöp toplanmasını önleme görevini yapacağını okudum.Bir işlev işaretçisini sabitleme
Ama bu verilen bir şey mi? Bu kodu barındıran AppPool'un erişim ihlali ile çöktüğünü gördüm. Neden işlev hatası toplayıcı çöp toplandığından bu hatanın meydana geldiğinden şüphe etmemeliyim?
Bu post, bu gerçeği desteklemektedir.
Güncelleme: Kazaları önemli ölçüde azalttığı görülüyor. Bu yaklaşımla ilgili bir problem var mı?
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);
Temsilci nesnesini statik bir değişkende saklamak yeterlidir. Yerel kod, birçok nedenden ötürü erişim ihlalleriyle bombalanabilir. –
Tam olarak bunu yaptım. Çöp toplamadan şüphelenmeye neden olma eğiliminde olmanın sebebi, erişim ihlalinin düzensiz gerçekleşmesidir. Ve daha da önemlisi, çökme dökümündeki çağrı yığını, yerli dll'yi clr.dll ve ardından yığının üstündeki kernel32.dll tarafından görebiliyorum. Bu sipariş tutarlıdır. – Krishter