2013-03-06 3 views
3

Я пытаюсь загрузить функцию в 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. (при условии, что вы получите там исключение). –

+0

Вы загружали сборку несколько раз? – Oliver

+0

@Oliver: Я загружаю сборку только один раз. –

ответ

8

Метод Type.GetMethod(string methodName) выдает исключение, указанное вами, если существует более одного метода с указанным именем (см. this MSDN topic). Поскольку Foo является перегрузкой, как вы говорите, я подозреваю, что в одной и той же DLL существует несколько методов Foo. Если у вас есть, например, методы:

IList<string> Foo() 

IList<string> Foo(object someParameter) 

Метод GetMethod(string methodName) не может определить, что вы хотите иметь. В этом случае вы должны использовать метод GetMethods и самостоятельно определить правильный метод.

+0

Спасибо, ваше предложение помогло. –

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

Спасибо.

У меня есть текстовое поле в ASCX (frontend) с именем Bio, элемент данных с именем Bio в виде списка <% # DataBinder.Eval (Container.DataItem, "Bio")%> и Я назвал строчную переменную Bio в .CS.

Отсутствие ошибок сборки или «красных линий», но сгенерировало ошибку во время выполнения. Я переименовал переменные по-разному, и ошибка исчезла. Программист, который написал код, не соблюдал соглашения об именах, такие как BioTxt. Это устраняет ошибку.

Смежные вопросы