2011-07-31 7 views
11

अप्रबंधित कोड मेरे कार्यों को कॉल करता है। पहले फ़ंक्शन में मुझे अपने प्रबंधित ऑब्जेक्ट पर पॉइंटर वापस भेजना चाहिए। कभी-कभी बाद में मेरे कुछ अन्य कार्यों को पैरामीटर में से एक के रूप में उसी पॉइंटर के साथ बुलाया जाता है। मुझे इसे कम करना चाहिए और कुछ गणना करने के लिए इसका इस्तेमाल करना चाहिए और फिर यदि इसकी आवश्यकता नहीं है तो इसका निपटान करें। कहानी को कम करने के लिए मुझे उस ऑब्जेक्ट को पिन करने की आवश्यकता है ताकि जीसी इसे स्थानांतरित न करे, जब तक मैं इसका निपटान नहीं करता। सी # में ऐसा कैसे करें? अग्रिम धन्यवाद।सी # में प्रबंधित ऑब्जेक्ट में पॉइंटर कैसे पिन करें?

+2

कुछ कोड पोस्ट करें, अधिमानतः एक * न्यूनतम, पूर्ण * उदाहरण। –

+1

पिन न करें। अप्रबंधित कोड के सूचक के लिए कोई उपयोग नहीं है। तो एक पॉइंटर पास न करें, 'हैंडल' पास करें। कहें, स्थिर 'सूची <> 'में एक अनुक्रमणिका। अब आप हैंडल वैल्यू से कॉलबैक में प्रबंधित संदर्भ को पुनः प्राप्त कर सकते हैं। –

उत्तर

10

सी # में किसी ऑब्जेक्ट को पिन करने के लिए, आप दूसरे पैरामीटर GCHandleType.Pinned के साथ GCHandle.Alloc विधि का उपयोग कर सकते हैं। GCHandle उदाहरण GCHandle.Free विधि का उपयोग करके जारी किया गया है जब तक ऑब्जेक्ट पिन किया गया है।

+0

GCHandle काम नहीं करेगा क्योंकि मेरी ऑब्जेक्ट blittable – apaka

+0

यह एक आकर्षण की तरह काम करता है जब आप GCHandle.Aloc (ऑब्जेक्ट वैल्यू) का उपयोग करते हैं और इसे IntPtr पर डाल देते हैं। – apaka

+1

@apaka: GCHandle.Alloc (object_value, GCHandleType.Pinned) + GCHandle.AddrOfPinnedObject। –

संबंधित मुद्दे