2012-10-10 11 views
5

मैं सी # .NET के लिए नया हूँ। मैं एक तरीका है जहाँ मैं फोन और एक DLL फ़ाइल है, जहां DLL फ़ाइल नाम एक स्ट्रिंग से आता है चलाने की आवश्यकता लिख ​​रहा हूँ, डीएलएल को कॉल और चलाने के लिए, जहां डीएलएल नाम स्ट्रिंग चर से आता है?

String[] spl; 

String DLLfile = spl[0]; 

मैं कैसे DLL से इस DLL आयात और एक समारोह कहते हैं पाने के लिए variable- प्रतिलाभ की मात्रा? मैं निम्नलिखित तरीके ..

String DLLfile = "MyDLL.dll"; 

[DllImport(DLLfile, CallingConvention = CallingConvention.StdCall)] 

की कोशिश की लेकिन यह काम नहीं किया, क्योंकि स्ट्रिंग 'स्थिरांक स्ट्रिंग' प्रकार और 'स्थिरांक स्ट्रिंग' चर का समर्थन नहीं करता में होना चाहिए। कृपया विस्तार प्रक्रिया के साथ मेरी मदद करें। धन्यवाद।

+1

कोई कारण है कि डीएलएल का नाम स्ट्रिंग में निहित होना चाहिए? ऐसा करने के लिए बहुत कम कानूनी कारणों से यह खतरनाक लगता है। –

+2

क्या डीएलएल एक और .NET असेंबली है? या शायद एक सी ++ डीएलएल? या यहां तक ​​कि एक COM डीएल ?. – Jamiec

+1

@Ramhound ऐसा करने का कारण यह है कि आप DLL के लिए पूर्ण पथ निर्दिष्ट कर सकते हैं। अन्यथा आप पुस्तकालय खोज आदेश पर निर्भर हैं। जो खतरनाक है। पूरा पथ निर्दिष्ट करना वह दृष्टिकोण है जो खतरे से बचाता है! –

उत्तर

3

आप क्रम में LoadAssembly विधि, और CreateInstance विधि का उपयोग कर सकते हैं विधि आह्वान करने के लिए

 Assembly a = Assembly.Load("example"); 
     // Get the type to use. 
     Type myType = a.GetType("Example"); 
     // Get the method to call. 
     MethodInfo myMethod = myType.GetMethod("MethodA"); 
     // Create an instance. 
     object obj = Activator.CreateInstance(myType); 
     // Execute the method. 
     myMethod.Invoke(obj, null); 
+2

केवल अगर यह एक प्रबंधित असेंबली है। –

+0

@ असेंबली असेंबली के लिए डारिन हां, टिप्पणी –

+0

टिप्पणी के लिए धन्यवाद यह सवाल यह स्पष्ट करता है कि संदर्भ अप्रबंधित DLLs –

5

देशी DLLs आप निम्नलिखित स्थिर वर्ग बना सकते हैं के लिए:

internal static class NativeWinAPI 
{ 
    [DllImport("kernel32.dll")] 
    internal static extern IntPtr LoadLibrary(string dllToLoad); 

    [DllImport("kernel32.dll")] 
    internal static extern bool FreeLibrary(IntPtr hModule); 

    [DllImport("kernel32.dll")] 
    internal static extern IntPtr GetProcAddress(IntPtr hModule, 
     string procedureName); 
} 

इस प्रकार है और फिर इसका इस्तेमाल:

// DLLFileName is, say, "MyLibrary.dll" 
IntPtr hLibrary = NativeWinAPI.LoadLibrary(DLLFileName); 

if (hLibrary != IntPtr.Zero) // DLL is loaded successfully 
{ 
    // FunctionName is, say, "MyFunctionName" 
    IntPtr pointerToFunction = NativeWinAPI.GetProcAddress(hLibrary, FunctionName); 

    if (pointerToFunction != IntPtr.Zero) 
    { 
     MyFunctionDelegate function = (MyFunctionDelegate)Marshal.GetDelegateForFunctionPointer(
      pointerToFunction, typeof(MyFunctionDelegate)); 
     function(123); 
    } 

    NativeWinAPI.FreeLibrary(hLibrary); 
} 

जहां MyFunctionDelegate एक है delegate। उदा .:

delegate void MyFunctionDelegate(int i); 
+1

+1, अभी तक एकमात्र सही उत्तर के लिए। –

+0

हाय निकोले खिल, – user1735274

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