2013-03-06 64 views
3

我正在尝试在dll中加载函数。加载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),不接受任何参数并且它是一个重载方法。那是我去错的地方还是其他地方?

是否有另一种方法来调用不接受任何参数的方法?我试过解决方案here,但它不工作。

+0

没有所有LoadLibrary/CreateInstance的示例代码可能会更清楚地显示问题 - 请尝试使用简化的“FooClass”进行简单示例并调用Invoke。 (假设你在那里得到例外)。 – 2013-03-06 08:01:29

+0

您是否多次加载程序集? – Oliver 2013-03-06 08:10:50

+0

@Oliver:我只装载一次组件。 – 2013-03-06 09:19:39

回答

8

的方法Type.GetMethod(string methodName)抛出你所提到的,如果有一个以上的方法具有指定名称除外(参见this MSDN topic)。由于Foo是一个超负荷,你说我怀疑在同一个DLL中有多个Foo方法。如果您有例如方法:

IList<string> Foo() 

IList<string> Foo(object someParameter) 

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

+0

谢谢,你的建议帮助。 – 2013-03-06 09:58:28

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"); 
11

如果有超载,你想不带任何参数调用该方法,这是正确的解决方案:

MethodInfo mi = obj.GetType().GetMethod("Foo", new Type[] { }); 
0

感谢。

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

没有生成错误或“红线”,但在运行时生成错误。我对变量进行了不同的重命名,错误消失了。编写代码的prgrammer不遵循命名约定,如BioTxt。这将消除错误。