动态调用带参数的 dll 和方法

Posted

技术标签:

【中文标题】动态调用带参数的 dll 和方法【英文标题】:Dynamically calling a dll and method with arguments 【发布时间】:2012-08-09 15:33:30 【问题描述】:

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

【问题讨论】:

另外,我尝试通过删除“Object o = Activator.CreateInstance(type);”来调用静态 dll 方法并更改为“method.Invoke(null, methodParameters);”抛出相同的异常。 【参考方案1】:

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

    您没有遍历所有parameters。您应该从 for 循环中删除 -1。 创建转换器时,调用GetType() 方法。这将返回 ParameterInfo 对象的 Type,而不是参数的 Type。请改用属性ParameterType

总而言之,将for 循环中的第一行更改为:

for (int i = 0; i < parameters.Length; i++)

   var converter = TypeDescriptor.GetConverter(parameters[i].ParameterType);

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

【讨论】:

以上是关于动态调用带参数的 dll 和方法的主要内容,如果未能解决你的问题,请参考以下文章

C#中调用dll,函数参数带指针,如何改写?

引用dll动态库,动态库中弹出对话框输入,将输入参数,作为变量继续调用。

怎么调用动态链接库函数?

C#中如何调用动态链接库DLL

vb.net如何动态调用WebService接口啊

静态库 动态库 调用