7

基本的に、名前でdllを呼び出し、オブジェクトをインスタンス化してから、そのdllの名前でメソッドを呼び出そうとしています。「呼び出しのターゲットによって例外がスローされました」というメッセージが表示されます。Method.Invokeの実行中。私の問題は、メソッドの引数の型キャストにあるとかなり確信しています。誰かがこの例外について何か意見を持っているかどうか疑問に思いました。さらに、私のアプローチを修正する方法についての提案は大歓迎です。

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

1 に答える 1

5

コードに2つの問題が見つかりました。

  1. すべてをループしているわけではありませんparameters。ループ-1から削除する必要があります。for
  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)方法をテストしたとき、それは私にとってはうまくいきました。

于 2012-08-09T16:37:40.360 に答える