2012-03-05 9 views
5

DllImport यहाँ के उपयोगों के बीच क्या अंतर है? विशेष रूप से, क्या "user32" का अर्थ केवल "user32.dll" है, या इसका मतलब है "user32.lib" या कुछ और?DllImport user32 user32.dll बनाम

[DllImport("user32")] 
protected static extern int GetKeyboardState(byte[] pbKeyState); 

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
protected static extern short GetKeyState(int vKey); 

आप शायद चारसेट और कॉलिंग कॉन्वेन्शन को अनदेखा कर सकते हैं।

यदि वे समान हैं, तो मैं इसे और अधिक संगत होने के लिए फिर से लिख सकता हूं, लेकिन यदि नहीं, तो मैं इसके साथ समस्याओं का एक गुच्छा नहीं चाहता हूं।

+0

[यहां कन्स्ट्रक्टर पर एमएसडीएन पृष्ठ है] (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.dllimportattribute.aspx) संदर्भ के लिए। – Guvante

+0

प्रासंगिक दस्तावेज़ीकरण यह है कि [लोड लाइब्रेरी] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175 (v = vs.85) .aspx) के लिए। * यदि स्ट्रिंग पथ के बिना मॉड्यूल नाम निर्दिष्ट करती है और फ़ाइल नाम एक्सटेंशन छोड़ा जाता है, तो फ़ंक्शन मॉड्यूल नाम पर डिफ़ॉल्ट लाइब्रेरी एक्सटेंशन .dll जोड़ता है। मॉड्यूल नाम में .dll को जोड़ने से रोकने के लिए, मॉड्यूल नाम स्ट्रिंग में एक पीछे बिंदु बिंदु (।) शामिल करें। * –

उत्तर

11

इस उदाहरण में, वहाँ कोई अंतर नहीं है। "user32.dll" बनाने के लिए .dll एक्सटेंशन स्वचालित रूप से "user32" पर जोड़ा जाएगा। हालांकि, यह मामला हमेशा नहीं होता है। यदि लाइब्रेरी फ़ाइल नाम में कोई अवधि है, तो .dll एक्सटेंशन स्वचालित रूप से संलग्न नहीं होगा।

कुछ उदाहरण:

[DllImport("user32")] -> का समाधान करता है "User32.dll"। सही बात।

[DllImport("user32.dll")] -> "User32.dll" हल करता है। सही बात।

[DllImport("mylib.version5")] -> "mylib.version5" को हल करता है। गलत

[DllImport("mylib.version5.dll")] -> "mylib.version5.dll" को हल करता है। सही बात।

+0

लगता है कि .NET के मोनो कार्यान्वयन में, लाइब्रेरी नाम में अवधि स्वचालित अनुलग्नक को रोकती नहीं है एक्सटेंशन। (कम से कम मोनो के संस्करण में यूनिटी 4.5.1 में उपयोग किया जाता है, जो मुझे लगता है कि मोनो 3.0 का एक संस्करण है।) – yoyo

+0

"लाइब्रेरी फ़ाइल नाम में अवधि" के लिए +1, मेरे सिर को उस समय के लिए खरोंच कर रहा है (जो अब स्पष्ट है)। – helmesjo

1

विंडोज पर वहाँ कोई अंतर नहीं है, आयात सफलतापूर्वक प्रदर्शन किया जाएगा अगर आप एक्सटेंशन को छोड़ रहा है। आम तौर पर <dllmap> कॉन्फ़िगरेशन सेक्शन के साथ मोनो चलाते समय एक्सटेंशन को छोड़ना वांछित होता है, जहां पी/Invoke रनटाइम उपनामों की तलाश करेगा।

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