2010-08-06 8 views
6

मैं निम्नलिखित सी ++ समारोह है कि एक DLL में लिपटे है कॉल करने के लिए कोशिश कर रहा हूँ:आप सी # में मार्टल एक बाइट सरणी कैसे कर सकते हैं?

unsigned char * rectifyImage(unsigned char *pimg, int rows, int cols) 

मेरे इंपोर्ट स्टेटमेंट की तरह लग रहा है:

[DllImport("mex_rectify_image.dll")] 
unsafe public static extern IntPtr rectifyImage(
byte[] data, int rows, int columns); 

और मेरे कॉल दिनचर्या ऐसा दिखाई देता है:

:

byte[] imageData = new byte[img.Height * img.Width * 3]; 
// ... populate imageData 
IntPtr rectifiedImagePtr = rectifyImage(imageData, img.Height, img.Width); 
Byte[] rectifiedImage = new Byte[img.Width * img.Height * 3]; 
Marshal.Copy(rectifiedImagePtr, rectifiedImage, 0, 3 * img.Width * img.Height); 

हालांकि, मैं एक क्रम त्रुटि प्राप्त हो रही

टाइप System.AccessViolationException का पहला मौका अपवाद xxx.dll में हुआ था सुरक्षित स्मृति को पढ़ने या लिखने का प्रयास किया गया। यह अक्सर एक संकेत है कि अन्य स्मृति भ्रष्ट है।

मैं सोच रहा हूं कि क्या गलती मेरे डेटा या मेरी आयातित डीएलएल फ़ाइल में मार्शल कर रही है ... किसी के पास कोई विचार है?

+0

आप इस प्रश्न को देखना चाहते हैं: http://stackoverflow.com/questions/289076/how-can-i-pass-a-pointer-to-an-array-using- पी-इनवोक-इन-सी – Bobby

+1

'rectifyImage' से वापसी मूल्य को मुक्त किया जाना चाहिए, और यदि हां, तो कैसे? –

+0

rectifyImage के लिए वापसी मूल्य का उपयोग C# बिटमैप ऑब्जेक्ट बनाने के लिए किया जाता है, और फिर मुक्त किया जाता है। मैं अभी तक इसे मुक्त करने के तरीके को समझने की कोशिश करने के लिए चारों ओर नहीं मिला है। – Tim

उत्तर

2

ऐसा संभवतः हो रहा है क्योंकि विधि का कॉलिंग सम्मेलन ऐसा नहीं है जैसा कि मार्शलर अनुमान लगा रहा है। आप DllImport विशेषता में सम्मेलन निर्दिष्ट कर सकते हैं।

आपको सी # घोषणा में 'असुरक्षित' कीवर्ड की आवश्यकता नहीं है क्योंकि यह 'असुरक्षित' कोड नहीं है। शायद आप इसे एक बिंदु पर एक 'निश्चित' सूचक के साथ कोशिश कर रहे थे और पोस्ट करने से पहले असुरक्षित कीवर्ड को निकालना भूल गए थे?

1

यह सुनिश्चित नहीं है कि यह आपकी समस्या है, लेकिन आम तौर पर सी ++ पॉइंटर्स IntPtr पर नक्शा। तो यह करने के लिए अपने आयात बयान को संशोधित करने का प्रयास करें:

[DllImport("mex_rectify_image.dll")] 
unsafe public static extern IntPtr rectifyImage(
IntPtr pData, int rows, int columns); 
+0

यह सुनिश्चित नहीं है कि मुझे वोट क्यों मिल रहा है, लेकिन मैंने इसका उत्तर देने का समय लिया ताकि मैं कम से कम एक टिप्पणी की उम्मीद करूँ कि मेरा जवाब आपकी पसंद के अनुसार क्यों नहीं है! क्या आपने वास्तव में मेरे सुझाव की कोशिश की है और यह काम नहीं किया है? –

0

rectifyImage डेटा के लिए एक ब्लॉक आप ब्लॉक में भेज रहे हैं में एक 1 बाइट के लिए एक ponter तलाश में है। छवि डेटा का प्रयास करें [0]

+0

यह काम नहीं करेगा, क्योंकि मार्शलर इसके संदर्भ के बजाए पहले बाइट की एक प्रति पास करेगा। तो आपको ऐसा करने के लिए असुरक्षित कोड का उपयोग करना होगा, और 'imageData [0]' की बजाय '& imageData [0]' पास करना होगा। – Luaan