संपादित करें: कुछ आलोचना मुझे मजबूर कर इस पर पुनर्विचार और इसे आगे अनुसंधान करने के लिए के आधार पर। मैं स्वतंत्र रूप से स्वीकार करता हूं कि IntPtr त्रुटि प्रवण है, मुझे लगता है कि "कठिन" अर्थों पर कुछ बहस हो सकती है, लेकिन यदि ढांचा स्वचालित रूप से इसे मार्शल कर सकता है और आपको चीजों को पिन करने से रोक सकता है, तो यदि आप IntPtr का उपयोग नहीं करते हैं तो मुझे लगता है मैं इस समझौते में हूं कि IntPtr "कठिन" होगा। यह आगे के शोध के बाद मुझे दिखाई देता है और सोचा कि यह आसान होगा (जब आपको पी/Invoke करने के लिए मजबूर किया जाता है और सी ++/सीएलआई रैपर नहीं बना सकता) अपनी संरचना घोषित करने के लिए (प्रबंधित कोड में और उसके बाद अपने मामले संस्करण) में यह रेफरी पैरामीटर के माध्यम से गुजरती हैं।
[StructLayout(LayoutKind.Sequential)]
struct Version
{
// Data members
}
[DllImport("mydll.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern Result Init(ref Version versionInfo);
मेरा अनुमान होगा आप IntPtr संस्करण चाहते हैं। अंतर यह है कि IntPtr एक वर्ग है कि करने के लिए एक सूचक का प्रबंधन करता है स्मृति, जबकि एक तर्क सूची में संदर्भ (रेफरी कीवर्ड) के रूप में पैरामीटर घोषित करने का अर्थ है कि आप गुजर रहे हैं संदर्भ से। आम तौर पर एक पी/इनवॉक कॉल के माध्यम से एक अप्रबंधित डीएल से डेटा पास करते समय, जब तक कि डेटा पास नहीं किया जाता है, एक वैनिला प्रकार (int, डबल, स्ट्रिंग - उचित मार्शल सजावट के साथ) मैं डेटा को इंटिप्टर के रूप में पास करता हूं। फिर आप अप्रबंधित संरचना की अपनी प्रबंधित घोषणा के लिए मार्शल IntPtr कर सकते हैं।
आप पी के बारे में अधिक जानकारी के लिए इस लिंक को आज़माना चाहिए/आह्वान कॉल: http://msdn.microsoft.com/en-us/magazine/cc164123.aspx
यह दुर्भाग्यपूर्ण है कि आप चीजें कठिन, त्रुटि-प्रवण तरीके से कर रहे हैं। यह और भी दुर्भाग्यपूर्ण है कि आप अन्य लोगों को भी ऐसा करने के लिए सिखा रहे हैं। –
@ बेन मैं इसे करने के लिए एक आसान/कम त्रुटि प्रवण तरीका सीखने में प्रसन्न हूं। क्या आपके पास कोई लिंक है या पढ़ने की सामग्री है।मैं पी/Invoking चीजों में बहुत समय बिताता हूं, ज्यादातर बार मैं एक सी ++/सीएलआई रैपर लिखता हूं, लेकिन जब मैं पी/इनवोक करने के लिए नीचे आ गया हूं तो मैंने केवल int, स्ट्रिंग जैसी चीजों के लिए रेफ पैरामीटर का उपयोग किया है (आने वाले मामलों में स्ट्रिंगबिल्डर), आदि, और फिर अन्य चीजों के लिए IntPtr का उपयोग किया। जीत के लिए – pstrjds
सी ++/सीएलआई :) उन अवसरों के लिए जब आप इसका उपयोग नहीं कर सकते (विंडोज सीई, या यह सुनिश्चित नहीं हो सकता कि दृश्य सी ++ रनटाइम स्थापित हो जाएगा), तो http://pinvoke.net में एक भयानक है बहुत सारे उदाहरण आम तौर पर, न केवल आदिम प्रकारों जैसे 'int' और' double' को सुरक्षित रूप से पी/आवेषण हस्ताक्षर में उपयोग किया जा सकता है, बल्कि उपयोगकर्ता-परिभाषित प्रकार भी प्राचीन प्रकार से बने होते हैं। उदाहरण 'POINT',' POINTF', 'RECT',' FONTMETRIC', 'BITMAPFILEHEADER', आदि –