2012-08-09 23 views
6

基本的には、DLLを名前で呼び出し、オブジェクトをインスタンス化してから、そのDLLで名前でメソッドを呼び出しようとしています。私は "例外は呼び出しのターゲットによってスローされました。" Method.Invoke中に。私はかなり私の問題は、メソッドの引数の型キャストと確信しています。私は誰もがこの例外について何か入力を持っているのだろうかと思っていた。さらに、私のアプローチを修正する方法に関する提案は歓迎されます。引数でDLLとメソッドを動的に呼び出す

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

代わりに私は "オブジェクトo = Activator.CreateInstance(型);を削除して静的なdllメソッドを呼び出そうとしました; "method.Invoke(null、methodParameters);"に変更します。同じ例外がスローされます。 – crlanglois

答えて

4

私はあなたのコードには2つの問題が見つかりました:あなたはすべてのparametersを超えるループしていない

  1. を。 forループから-1を削除する必要があります。
  2. コンバータを作成するときは、GetType()メソッドを呼び出します。これにより、パラメータのTypeではなく、ParameterInfoオブジェクトのTypeが返されます。代わりにプロパティParameterTypeを使用してください。すべてのすべてで

、これにforループの最初の行を変更します。

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

あなたはこれらの修正を行っているしたら、私が意図したとおりに、あなたのコードを実行する必要があります信じています。私が単純なvoid Hello(int x, string y)メソッドをテストしたとき、少なくともそれは私のためでした。

関連する問題