4

我正在尝试在 dll 中加载一个函数。dll 已加载,但就在调用函数的地方,我遇到了异常

找到不明确的匹配项

这是代码片段。

Assembly dll = Assembly.LoadFrom(DLLPATH);
if (dll != null)
{
    Type Tp = dll.GetType("ABCD.FooClass");
    if (Tp != null)
    {
        Object obj = Activator.CreateInstance(Tp);

        if (obj != null)
        {                            
            List = (List<String>)obj.GetType().GetMethod("Foo").Invoke(obj, null);
        }
        else
        {
            Console.WriteLine("obj is null");
        }
    }
    Console.WriteLine("Type is null");
}
else
    Console.WriteLine("Dll is not loaded");

Console.ReadKey();

我正在调用的方法(即Foo不接受任何参数,它是一个重载方法。那是我出错的地方还是其他地方?

是否有另一种方法可以调用不接受任何参数的此类方法?我尝试了此处发布的解决方案,但它不起作用。

4

4 回答 4

11

如果存在重载并且您想调用不带参数的方法,这是正确的解决方案:

MethodInfo mi = obj.GetType().GetMethod("Foo", new Type[] { });
于 2013-12-31T19:07:41.047 回答
8

Type.GetMethod(string methodName)如果有多个具有指定名称的方法(请参阅此 MSDN 主题) ,该方法将引发您提到的异常。正如Foo您所说的重载,我怀疑Foo同一个 DLL 中有多个方法。如果您有例如方法:

IList<string> Foo()

IList<string> Foo(object someParameter)

该方法GetMethod(string methodName)无法确定您要拥有哪一个。在这种情况下,您应该使用该方法GetMethods并自行确定正确的方法。

于 2013-03-06T08:27:00.407 回答
3

谢谢大家帮助。!!

正如我告诉你的,我调用的方法(即 FOO)是重载的。我想我没有正确使用 GetMethod()。现在,我找到了使用 GetMethods() 函数的解决方案。

我以以下方式更改了我的代码并且它起作用了。!

Assembly dll = Assembly.LoadFrom(DLLPATH);
if (dll != null)
{
   Type Tp = dll.GetType("ABCD.FooClass");
   if (Tp != null)
   {
      Object obj = Activator.CreateInstance(Tp);
      if (obj != null)
      {                            
         MethodInfo[] AllMethods = obj.GetType().GetMethods();
         MethodInfo Found = AllMethods.FirstOrDefault(mi => mi.Name == "Foo" && mi.GetParameters().Count() == 0);
         if (Found != null)
             List = (List<String>)Found.Invoke(obj, null);           
      }
      else
        Console.WriteLine("obj is null");       
   }
    else
     Console.WriteLine("Type is null");
 }
  else
     Console.WriteLine("Dll is not loaded");
于 2013-03-06T10:11:35.113 回答
0

谢谢。

我的“发现歧义匹配”是我在 ASCX(frontend) 中有一个名为 Bio 的文本框,在列表视图 <%# DataBinder.Eval(Container.DataItem, "Bio")%> 中有一个名为 Bio 的数据元素,我命名了一个字符串.CS 中的变量 Bio。

没有构建错误或“红线”,但在运行时产生错误。我以不同的方式重命名了变量,错误就消失了。编写代码的程序员没有遵循 BioTxt 等命名约定。这将消除错误。

于 2016-04-11T19:01:30.600 回答