使用参数动态调用dll和方法

时间:2012-08-09 15:33:31

标签: c# dynamic dll methods invoke

基本上我试图通过名称调用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); }

1 个答案:

答案 0 :(得分:4)

我发现您的代码有两个问题:

  1. 您没有遍历所有parameters。您应该从-1循环中删除for
  2. 在创建转换器时,请调用GetType()方法。这将返回Type对象的ParameterInfo,而不是参数的Type。请改为使用属性ParameterType
  3. 总而言之,将for循环中的第一行更改为:

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

    完成这些更正后,我相信您的代码应按预期运行。当我测试一个简单的void Hello(int x, string y)方法时,至少它对我有用。