का सही उपयोग मान लीजिए कि एक C++ विधि int NativeMethod(double, double *)
एक Native.dll में है। मेरे प्रबंधित कोड से इस विधि बुला पहला प्रयास (यह मानते हुए मैं प्रवेश बिंदु निर्दिष्ट करने की आवश्यकता नहीं है) किया गया थाDllImport
[DllImport("Native.dll")]
private static extern int NativeMethod(double inD, IntPtr outD);
फिर DLL उपयोग करने के लिए मैंने किया था
IntPtr x = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr)));
NativeMethod(2.0, x);
//do stuff with x
Marshal.FreeHGlobal(x); //crash
मुझे समझ में करना चाहते हैं यह यहाँ क्यों दुर्घटनाग्रस्त है। मेरा पहला अनुमान यह है कि यह एक ढेर समस्या है क्योंकि इस तथ्य के कारण कि डीएलएल और मेरा आवेदन एक अलग सीआरटी का उपयोग कर सकता है। लेकिन अगर ऐसा होता तो इसके बजाय मूल विधि दुर्घटना के लिए कॉल क्यों नहीं होगा? विधि ने एक एक्स वापस कर दिया कि मैं सफलतापूर्वक डबल से निकाला जा सकता था।
मैं आयात संदर्भ
[DllImport("Native.dll")]
private static extern int NativeMethod(double inD, IntPtr outD);
द्वारा डबल पास करके काम करने के लिए प्राप्त करने में सक्षम हूँ क्यों पहले ही प्रयास में FreeHGlobal दुर्घटना, और देशी तरीकों की ओर इशारा पारित करने के लिए सुझाया गया तरीका क्या है करता है? आउट कीवर्ड इस स्थिति को ठीक से काम कर सकता है, लेकिन अगर मुझे मार्शल को स्ट्रिंग की ज़रूरत होती तो क्या होगा? मुझे नहीं लगता कि मैं AllocH और Freeh आसपास पहुंच सकते हैं ...
त्रुटि संदेश आपको क्या देता है? – Amy
बेशक, यह टाइपफ (डबल) होना चाहिए। लेकिन मुझे लगता है कि SizeOf (टाइपऑफ (आईएनपीपीआरटी) हमेशा होता है> = आकारऑफ (टाइपऑफ (डबल)), तो यह किसी भी तरह से काम कर सकता है। दिलचस्प, "एक्स के साथ सामान" क्या है? –