2013-03-06 62 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。這將消除錯誤。