2015-06-06 6 views
6

मैं अपने सी # कोड में एक अप्रबंधित फ़ंक्शन का आह्वान कर रहा हूं।मार्शल [इन] [आउट] गुण

इस समारोह की घोषणा का पालन है:

int myFun(unsigned char* inputBuffer, unsigned char* &outputBuffer); 

मैं इस प्रकार इस समारोह का उपयोग करें:

[DllImport("myDLL.dll", CallingConvention = CallingConvention.Cdecl)] 
private static extern int myFun([In] byte[] inputBuffer, out IntPtr outputBuffer); 

byte[] a = Encoding.ASCII.GetBytes("sampletext!"); 
IntPtr b; 
res = myFun(a, out b); 

हालांकि मैं byte[] inputBuffer के लिए [InAttribute] उल्लेख किया है, समारोह अभी भी a के मूल्यों changeds। ऐसा लगता है कि सीएलआर अपने डिफ़ॉल्ट मार्शलिंग व्यवहार का उपयोग कर रहा है। मैंने byte[] का उपयोग किया क्योंकि यह unsigned char* के लिए सी # समतुल्य है।

जब मैं byte[] को char[] के साथ प्रतिस्थापित करता हूं तो सीएलआर मेरे इन-आउट विशेषताओं का पालन करेगा।

मैं आपकी सहायता की अत्यधिक सराहना करता हूं। अधिक जानकारी के लिए कृपया यह msdn page पढ़ें।

+0

शायद 'मार्शल' जो आप खोज रहे हैं? – atlaste

+1

पिनवोक मार्शलर केवल डेटा को कॉपी करता है जब इसे करना होता है। यह बाइट [] के साथ नहीं है, यह सिर्फ सरणी पिन करता है और पहले तत्व के लिए एक सूचक को पास करता है। तो मूल कोड सीधे प्रबंधित सरणी पर पार्टी कर रहा है। बहुत ही कुशल। Char [] के लिए अलग, तत्वों को 16-बिट मान से 8-बिट मान में परिवर्तित करना होगा। आपको एन्कोडिंग.डिफॉल्ट मान मिलेगा। पिनवोक मार्शलर * को कॉपी करना होगा, यह बिना [आउट] के प्रतिलिपि नहीं करेगा। –

उत्तर

8
documentation से

, मेरे जोर देने के साथ:

एक अनुकूलन के रूप में, blittable प्रकार और वर्गों है कि इसमें केवल blittable सदस्यों के बजाय पिन किए गए होते प्रमुखता के दौरान उन्हें कॉपी की सरणियों। इन प्रकारों को इन/आउट पैरामीटर के रूप में मार्शल किया जा सकता है जब कॉलर और कैली एक ही अपार्टमेंट में होते हैं। हालांकि, इन प्रकारों को वास्तव में पैरामीटर के रूप में मार्शल किया गया है, और यदि आप इन/आउट पैरामीटर के रूप में तर्क को मार्शल करना चाहते हैं तो आपको इनएट्रिब्यूट और आउटएट्रिब्यूट विशेषताओं को लागू करना होगा।

byte के बाद से blittable है, बाइट के अपने सरणी के बजाय पिन किया गया है की नकल की है, और में/बाहर इतनी के रूप में मार्शलों।

जब मैं बाइट [] को char [] के साथ प्रतिस्थापित करता हूं [सीएलआर मेरे इन-आउट विशेषताओं का पालन करेगा।

सी # प्रकार charnot blittable है। char की एक सरणी पिन नहीं है, और इसलिए [In] char[] मार्शल इन पैरामीटर के रूप में है।

+0

* सी # प्रकार चार ब्लिटेबल नहीं है। * क्या होगा यदि उसने चार्सेट यूनिकोड का उपयोग किया? – xanatos

+0

@xanatos मेरे उत्तर में दस्तावेज़ लिंक 'System.Char' को गैर-ब्लिटेबल –

+0

@ डेविड हेफ़र्नन के रूप में सूचीबद्ध करता है, जो आपके उत्तर के लिए बहुत धन्यवाद है। यह आलेख भी उपयोगी है। https://msdn.microsoft.com/en-us/library/23acw07k%28v=vs.110%29.aspx –

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