जैसा कि अन्य ने उल्लेख किया है, प्रबंधितbyte[]
में प्रतिलिपि किए बिना डेटा को स्टोर करने के लिए कोई तरीका नहीं है (आपके द्वारा प्रदान की गई वर्तमान संरचना के साथ *)। हालांकि, यदि आप वास्तव में को की आवश्यकता नहीं है तो यह एक प्रबंधित बफर में हो, आप unsafe
ऑपरेशंस का उपयोग सीधे अप्रबंधित स्मृति के साथ काम करने के लिए कर सकते हैं। यह वास्तव में निर्भर करता है कि आपको इसके साथ क्या करने की ज़रूरत है।
सभी byte[]
और अन्य संदर्भ प्रकार सीएलआर कचरा कलेक्टर द्वारा प्रबंधित किए जाते हैं, और यह अब उपयोग नहीं होने पर स्मृति और डिलोकेशन के आवंटन के लिए ज़िम्मेदार है। GetBuffer
की वापसी से इंगित स्मृति, सी ++ कोड द्वारा आवंटित अप्रबंधित स्मृति का एक ब्लॉक है और (स्मृति मेमोरी/कार्यान्वयन विवरण अलग-अलग) अनिवार्य रूप से आपकी जीसी प्रबंधित स्मृति से अलग है। इसलिए, यदि आप जीसी प्रबंधित सीएलआर प्रकार (byte[]
) का उपयोग करना चाहते हैं, तो वर्तमान में आपके अप्रबंधित स्मृति के भीतर आपके द्वारा बनाए गए सभी डेटा को आपके IntPtr
पर इंगित किया गया है, तो इसे जीसी के बारे में पता चलने वाली स्मृति में स्थानांतरित (प्रतिलिपि) की आवश्यकता है। यह Marshal.Copy
द्वारा या unsafe
कोड या पिनवोक या आपके पास क्या है, एक कस्टम विधि द्वारा किया जा सकता है।
हालांकि, यह निर्भर करता है कि आप इसके साथ क्या करना चाहते हैं। आपने इसका वीडियो डेटा उल्लेख किया है। यदि आप डेटा में कुछ ट्रांसफॉर्म या फ़िल्टर लागू करना चाहते हैं, तो आप शायद इसे सीधे अप्रबंधित बफर पर कर सकते हैं। यदि आप बफर को डिस्क पर सहेजना चाहते हैं, तो आप शायद इसे सीधे अप्रबंधित बफर पर कर सकते हैं।
लंबाई के विषय पर, एक अप्रबंधित मेमोरी बफर की लंबाई जानने का कोई तरीका नहीं है जब तक कि बफर आवंटित फ़ंक्शन आपको यह भी बताता है कि लंबाई क्या है। यह कई तरीकों से किया जा सकता है, क्योंकि टिप्पणीकारों ने उल्लेख किया है (संरचना का पहला क्षेत्र, विधि पर paramtere बाहर)।
* अंत में, यदि आपके पास सी ++ कोड का नियंत्रण है तो इसे संशोधित करना संभव हो सकता है ताकि यह बफर आवंटित करने के लिए ज़िम्मेदार न हो, यह डेटा लिखता है, और इसके बजाय एक प्रीफरोकेटेड बफर को पॉइंटर प्रदान किया जाता है। इसके बाद आप प्रबंधितbyte[]
सी # में बना सकते हैं, जो आपके सी ++ कोड द्वारा आवश्यक आकार के लिए आवंटित है, और इसे पिन करने के लिए GCHandle
प्रकार का उपयोग करें और अपने सी ++ कोड को पॉइंटर प्रदान करें।
आपको निश्चित रूप से डेटा कॉपी करना चाहिए क्योंकि 'IntPtr' * अप्रबंधित स्मृति * में इंगित करता है! – Yahia
आपके बहुत तेज़ उत्तर के लिए धन्यवाद, लेकिन IntPtr को C++ निर्यात फ़ंक्शन से वापस कर दिया गया था, इसलिए मैं इसे कहीं भी प्रबंधित और हटा सकता हूं। मैं डेटा कॉपी नहीं करना चाहता क्योंकि डेटा वीडियो बफर है, इसलिए यह बहुत बड़ा है। प्रतिलिपि खराब प्रदर्शन करेगी। धन्यवाद! – TTGroup
असुरक्षित प्रथाओं के लिए वास्तव में जाने का कोई कारण नहीं है ... आपको वास्तव में सामग्री की प्रतिलिपि बनाना चाहिए - ऐसा करने के लिए कई सुरक्षित तरीके हैं (कुछ दूसरों की तुलना में तेज़) ... – Yahia