2012-08-09 6 views
6

Grundsätzlich versuche ich, eine DLL mit Namen aufzurufen, instanziieren ein Objekt, dann rufen Sie eine Methode nach Name in dieser DLL. Ich erhalte eine "Ausnahme wurde vom Ziel eines Aufrufs ausgelöst." während der Methode.Invozieren. Ich bin ziemlich sicher, dass mein Problem mit der Typumwandlung der Argumente der Methode ist. Ich habe mich gefragt, ob irgendjemand etwas zu dieser Ausnahme gehört hat. Darüber hinaus sind alle Vorschläge zur Überarbeitung meines Ansatzes willkommen.Dynamisch Aufruf einer DLL und Methode mit Argumenten

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

Alternativ habe ich versucht, statische DLL-Methoden durch Entfernen der "Object o = Activator.CreateInstance (Typ);" und zu "method.Invoke (null, methodParameters) wechseln"; mit der gleichen Ausnahme wird geworfen. – crlanglois

Antwort

4

fand ich zwei Probleme mit dem Code:

  1. Sie sind alle parameters nicht Schleifen über. Sie sollten -1 aus der Schleife for entfernen. Wenn Sie Ihren Konverter erstellen, rufen Sie die GetType() Methode auf. Dies gibt das Type des Objekts ParameterInfo zurück, nicht das Type des Parameters. Verwenden Sie stattdessen die Eigenschaft ParameterType.

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

    Sobald Sie diese Korrekturen getan haben, ich glaube, Ihr Code sollte wie geplant laufen:

Alles in allem die ersten Zeilen in dem diese for Schleife ändern. Zumindest war es für mich, als ich eine einfache void Hello(int x, string y) Methode getestet habe.