2012-08-09 23 views
6

Básicamente, estoy tratando de llamar a un dll por nombre, crear una instancia de un objeto, y luego llamar un método por nombre en ese dll. Recibo una "Excepción arrojada por el objetivo de una invocación". durante el Método.Invocar. Estoy bastante seguro de que mi problema está en la conversión de los argumentos del método. Me preguntaba si alguien tenía alguna opinión sobre esta excepción. Además, cualquier sugerencia sobre cómo revisar mi enfoque es bienvenida.Llamar dinámicamente a un dll y a un método con argumentos

public void calldll(string dllName, string typeName, string methodName, string arguments) { 

    string[] argumentArray = arguments.Split(new char[] { '|' }, StringSplitOptions.None); 

    Assembly assembly = Assembly.LoadFrom(dllName); 
    System.Type type = assembly.GetType(typeName); 
    Object o = Activator.CreateInstance(type); 
    MethodInfo method = type.GetMethod(methodName); 
    ParameterInfo[] parameters = method.GetParameters(); 

    object[] methodParameters = new object[parameters.GetLength(0)]; 

    for (int i = 0; i < parameters.Length - 1; i++) 
    { 
     var converter = TypeDescriptor.GetConverter(parameters[i].GetType()); 
     methodParameters[i] = converter.ConvertFrom(argumentArray[i]); 
    } 

    method.Invoke(o, methodParameters); } 
+0

Como alternativa, he intentado llamar a métodos dll estáticos eliminando el "Objeto o = Activador.CrearInstancia (tipo);" y cambiando a "method.Invoke (null, methodParameters);" con la misma excepción lanzada. – crlanglois

Respuesta

4

me encontré con dos problemas con su código:

  1. Usted no se ha entrado en un bucle sobre todos parameters. Debe eliminar -1 del bucle for.
  2. Cuando está creando su convertidor, llama al método GetType(). Esto devuelve el Type del objeto ParameterInfo, no el Type del parámetro. Use la propiedad ParameterType en su lugar.

Con todo, cambiar las primeras líneas en el bucle for a esto:

for (int i = 0; i < parameters.Length; i++) 
{ 
    var converter = TypeDescriptor.GetConverter(parameters[i].ParameterType); 

Una vez que haya hecho estas correcciones, creo que el código debe funcionar según lo previsto. Al menos lo hizo por mí cuando probé un método simple void Hello(int x, string y).

Cuestiones relacionadas