2010-07-13 15 views
7

का सही उपयोग मान लीजिए कि एक 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 आसपास पहुंच सकते हैं ...

+0

त्रुटि संदेश आपको क्या देता है? – Amy

+0

बेशक, यह टाइपफ (डबल) होना चाहिए। लेकिन मुझे लगता है कि SizeOf (टाइपऑफ (आईएनपीपीआरटी) हमेशा होता है> = आकारऑफ (टाइपऑफ (डबल)), तो यह किसी भी तरह से काम कर सकता है। दिलचस्प, "एक्स के साथ सामान" क्या है? –

उत्तर

5

समस्या है कि विधि एक double* है जो लेता है एक डबल के लिए एक सूचक। आप एक सूचक में गुजर रहे हैं जो IntPtr पर इंगित कर रहा है। यह केवल महत्वपूर्ण है कि double (8 बाइट्स) और IntPtr के बीच एक आकार अंतर है जो परिवर्तनीय आकार (या तो 4 या 8 बाइट्स) है। आप एक double

IntPtr x = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(double)); 
+0

आह, बहुत धन्यवाद .. मैं msdn संदर्भ में प्लेटफ़ॉर्म-विशिष्ट आकार के बारे में हिस्सा चूक गया। – insipid

2

मैं एक विशेषज्ञ नहीं हूँ, लेकिन यह नहीं होना चाहिए:

IntPtr x = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(double))); 
7

मैं अपने लक्ष्य को गलतफहमी हो सकती है सूचक आवंटित करने के लिए की जरूरत है, लेकिन ऐसा लगता है कि आप इसे और अधिक जटिल की तुलना में आवश्यक है कर रहे हैं। बस इसे संदर्भ से पास करें और इसके नीचे मार्शलिंग की देखभाल करें।

[DllImport("Native.dll")] 
private static extern int NativeMethod(double inD, ref double outD); 

double x; 

x = 1; 
NativeMethod(2.0, ref x); 
+0

+1 सबसे अधिक प्रतिनिधि रेफरी के बजाय उपयोग करना होगा। ओपी ने कभी पॉइंटर शुरू नहीं किया था। – JaredPar

+0

@ जेरेडपायर, यह सच है। मैं अनिश्चित था कि ओपी रेफ या आउट व्यवहार की इच्छा रख रहा था, लेकिन मैं उस स्पष्ट सुराग को पहचानने में असफल रहा (तथ्य यह है कि उसने इसे उदाहरण में शुरू नहीं किया था)। –

+0

असम्बद्ध स्मृति प्राप्त करने के लिए आउट/रेफ बनाम AllocHGlobal का उपयोग करने के प्रभाव क्या हैं? क्या जीसी मेमोरी को पुनर्व्यवस्थित कर सकता है और विधि/फ़ंक्शन रिटर्न से पहले पॉइंटर संदर्भ बदल सकता है? –

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

  • कोई संबंधित समस्या नहीं^_^