मैं अपने सी # कोड में एक अप्रबंधित फ़ंक्शन का आह्वान कर रहा हूं।मार्शल [इन] [आउट] गुण
इस समारोह की घोषणा का पालन है:
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 पढ़ें।
शायद 'मार्शल' जो आप खोज रहे हैं? – atlaste
पिनवोक मार्शलर केवल डेटा को कॉपी करता है जब इसे करना होता है। यह बाइट [] के साथ नहीं है, यह सिर्फ सरणी पिन करता है और पहले तत्व के लिए एक सूचक को पास करता है। तो मूल कोड सीधे प्रबंधित सरणी पर पार्टी कर रहा है। बहुत ही कुशल। Char [] के लिए अलग, तत्वों को 16-बिट मान से 8-बिट मान में परिवर्तित करना होगा। आपको एन्कोडिंग.डिफॉल्ट मान मिलेगा। पिनवोक मार्शलर * को कॉपी करना होगा, यह बिना [आउट] के प्रतिलिपि नहीं करेगा। –