2012-10-10 16 views
5

Jestem nowy w C# .NET. Piszę metodę, gdy trzeba zadzwonić i uruchomić plik DLL, gdzie nazwa pliku DLL pochodzi z String o zmiennejz metody C#, jak wywołać i uruchomić DLL, gdzie nazwa DLL pochodzi od zmiennej String?

String[] spl; 

String DLLfile = spl[0]; 

Jak mogę zaimportować DLL i wywołania funkcji z biblioteki DLL, aby uzyskać zwracana wartość? Próbowałem następujący sposób ..

String DLLfile = "MyDLL.dll"; 

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

Ale to nie działało, jak Łańcuch powinien znajdować się w „const string” i „typu const string” nie obsługuje zmienne. Proszę pomóż mi z procedurą szczegółową. Dzięki.

+1

Czy istnieje jakiś powód, dla którego nazwa pliku dll musi być zawarta w ciągu znaków? To wydaje się niebezpieczne z bardzo niewielu uzasadnionych powodów, aby to zrobić. –

+2

Czy biblioteka DLL jest kolejnym zestawem .NET? lub może dll C++? lub nawet dll COM ?. – Jamiec

+1

@Ramhound Przyczyną tego jest możliwość podania pełnej ścieżki do biblioteki DLL. W przeciwnym razie jesteś zależny od kolejności wyszukiwania w bibliotece. Co jest niebezpieczne. Określanie pełnej ścieżki jest podejściem, które unika niebezpieczeństwa! –

Odpowiedz

3

Można użyć LoadAssembly metody i CreateInstance sposób, aby wywołać metodę

 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

Tylko jeśli jest to zespół zarządzany. –

+0

@Darin tak dla zarządzanego montażu, dziękuję za uwagę –

+0

Pytanie wyjaśnia, że ​​kontekstem są niezarządzane biblioteki DLL –

5

dla rodzimych DLL można utworzyć następujące klasy statyczne:

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); 
} 

a następnie używać go w sposób następujący:

// 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); 
} 

Gdzie MyFunctionDelegate jest delegate. Np .:

delegate void MyFunctionDelegate(int i); 
+1

+1, za jedyną prawidłową odpowiedź do tej pory. –

+0

Witaj Nikolay Khil, – user1735274