2012-08-09 11 views
6

Fondamentalmente sto provando a chiamare una dll per nome, creare un'istanza di un oggetto, quindi chiamare un metodo per nome in quella dll. Ricevo "Un'eccezione è stata lanciata dall'obiettivo di un'invocazione". durante il Method.Invoke. Sono abbastanza sicuro che il mio problema è con il typecasting degli argomenti del metodo. Mi stavo chiedendo se qualcuno avesse qualche input su questa eccezione. Inoltre, qualsiasi suggerimento su come modificare il mio approccio è benvenuto.Chiamare dinamicamente una dll e un metodo con argomenti

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

In alternativa ho provato a chiamare i metodi di dll statici rimuovendo "Object o = Activator.CreateInstance (type);" e passando a "method.Invoke (null, methodParameters);" con la stessa eccezione che viene lanciata. – crlanglois

risposta

4

ho trovato due problemi con il tuo codice:

  1. Non sei loop su tutti parameters. È necessario rimuovere -1 dal ciclo for.
  2. Quando si crea il convertitore, si chiama il metodo GetType(). Restituisce il Type dell'oggetto ParameterInfo, non lo Type del parametro. Utilizzare invece la proprietà ParameterType.

Tutto sommato, modificare le prime righe del ciclo for a questo:

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

Una volta che avete fatto queste correzioni, credo che il codice dovrebbe funzionare come previsto. Almeno lo ha fatto per me quando ho provato un semplice metodo void Hello(int x, string y).

Problemi correlati