.NET में Arrays को संगत स्मृति में दर्शाया गया है। तो इसका मतलब है कि स्मृति में, तत्व 0 के बाद, तत्व 1 सीधे पिछले तत्व के बाद आएगा, और इसी तरह।
यदि आप GCHandle.Alloc
के साथ सरणी पिन, तो इसका मतलब है कि तत्वों की पूरे सूची के रूप में अच्छी तरह से स्मृति में पिन किया गया है, और आप संसाधित कर सकते हैं कि अप्रबंधित कोड में।
हालांकि, जैसा कि आपने उल्लेख किया है, यह केवल तभी समझ में आता है जब यह प्रकार एक विचित्र प्रकार है (तकनीकी रूप से, यह सच नहीं है, यह है कि अगर प्रकार अप्रबंधित कोड पर मार्शल किया जा सकता है, हालांकि बहुत अधिक ओवरलैप है यहाँ ब्लिटेबल प्राथमिक प्रकारों और सामानों के बीच जो पी/Invoke/COM इंटरऑप परत स्वचालित रूप से संभालते हैं)।
तो यदि आपके पास मूल्य प्रकारों की एक सरणी है, तो आप GCHandle.Alloc
पर कॉल कर सकते हैं और यह आपके लिए सरणी पिन करेगा। हालांकि, पी/Invoke परत पहले से ही यह आपके लिए करता है, इसलिए आपको इससे चिंतित नहीं होना चाहिए।
यदि आपकी सरणी संदर्भों से भरी है, तो इसे असम्बद्ध कोड पर मार्शल करना किसी भी तरह से समझ में नहीं आता है; यहां तक कि यदि आप प्रत्येक संदर्भ को पिन करते हैं, तो अप्रबंधित कोड को यह नहीं पता होगा कि स्मृति में उस संदर्भ के साथ क्या करना है, क्योंकि प्रकार सिस्टम .NET प्रकार का समर्थन नहीं करता है जो संदर्भ स्मृति में इंगित कर रहा है।
यदि .NET में कक्षा वास्तव में एक देशी संरचना का एक रैपर/.NET प्रतिनिधित्व है, तो आप .NET में उस संरचना की सरणी बनाने से बेहतर हैं, इसमें सभी डेटा कॉपी कर रहे हैं, और फिर इसे भेज रहे हैं अपने मूल कोड के लिए।
या, आप मूल कोड में .NET सदस्यों की पहुंच को सुविधाजनक बनाने के लिए सी ++/क्ली में अपनी कक्षा लिख सकते हैं।
क्या आप भले ही आप उन्हें मिल सकता है पिन किए गए इन वस्तुओं के लिए ऐसा करने में सक्षम होने की उम्मीद करते हैं? संदर्भ जरूरी नहीं हैं पॉइंटर्स; आप उन्हें मूल पक्ष से नहीं पहुंच पाएंगे। – MikeP