मुझे एक अप्रबंधित टीसीपी रिसीवर को प्रबंधित कॉलबैक पास करने की आवश्यकता है। चूंकि यह एक धागा है जो आवेदन के जीवनकाल के लिए मौजूद होना आवश्यक है, इसलिए मुझे इसे कचरा इकट्ठा करने से रोकने की जरूरत है। मैंने हर जगह पढ़ा है कि फ़िनिंग पॉइंटर्स को पिन करना आवश्यक नहीं है और GCHandle.Alloc कचरा संग्रह को रोकने का काम करेगा।एक फ़ंक्शन पॉइंटर पिन करें
लेकिन क्या यह एक दिया गया है? मैंने देखा है कि इस कोड को होस्ट करने वाला ऐपपूल एक्सेस उल्लंघन के साथ दुर्घटनाग्रस्त हो जाता है। मुझे इस तथ्य पर संदेह क्यों नहीं होना चाहिए कि यह त्रुटि तब होती है क्योंकि फ़ंक्शन पॉइंटर कचरा इकट्ठा किया गया था?
यह 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 के बाद और फिर stack के शीर्ष पर kernel32.dll देख सकता हूं। यह आदेश सुसंगत है। – Krishter