2012-10-10 16 views
5

Soy nuevo en C# .NET. Estoy escribiendo un método donde tengo que llamar y ejecutar un archivo DLL, donde el nombre del archivo DLL viene de una cadena variablede un método C#, cómo llamar y ejecutar una DLL, donde el nombre de la DLL proviene de una variable String?

String[] spl; 

String DLLfile = spl[0]; 

¿Cómo puedo importar este archivo DLL y llamar a una función de la DLL para obtener el valor de retorno? Probé el de la siguiente manera ..

String DLLfile = "MyDLL.dll"; 

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

pero no trabajado, como la cadena debe estar en el tipo 'const string' y 'const string' no soporta variables. Por favor, ayúdenme con el procedimiento detallado. Gracias.

+1

¿Hay alguna razón para que el nombre de la dll deba estar contenido en una cadena? Esto parece peligroso con muy pocas razones legítimas para hacer esto. –

+2

¿Es el dll otro ensamblado de .NET? o tal vez un C++ dll? o incluso un dll COM ?. – Jamiec

+1

@Ramhound La razón para hacerlo es para que pueda especificar la ruta completa a la DLL. De lo contrario, depende de la orden de búsqueda de la biblioteca. Que es peligroso ¡Especificar la ruta completa es el enfoque que evita el peligro! –

Respuesta

3

Puede utilizar LoadAssembly método y CreateInstance método con el fin de invocar el método

 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

Solo si se trata de un ensamblaje administrado. –

+0

@Darin yes para ensamblado administrado, gracias por la observación –

+0

La pregunta deja en claro que el contexto no es administrado DLLs –

5

Para archivos DLL nativos que puede crear la siguiente clase estática:

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

y luego usarlo como sigue:

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

Donde MyFunctionDelegate es un delegate. P. ej .:

delegate void MyFunctionDelegate(int i); 
+1

+1, por la única respuesta correcta hasta el momento. –

+0

Hola Nikolay Khil, – user1735274

Cuestiones relacionadas