2013-03-06 1 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를 호출하십시오. (예외가 있다고 가정). –

+0

어셈블리를 여러 번로드 했습니까? – Oliver

+0

@Oliver : 어셈블리를 한 번만로드합니다. –

답변

8

Type.GetMethod(string methodName) 메서드는 지정된 이름을 가진 메서드가 두 개 이상인 경우 언급 한 예외를 throw합니다 (this MSDN topic 참조). 동일한 DLL에 Foo 메서드가 여러 개 있다고 의심되면 Foo은 과부하입니다.

IList<string> Foo() 

IList<string> Foo(object someParameter) 

방법 GetMethod(string methodName)은 당신이 할 일 확인할 수 없습니다 : 당신은 예를 들어, 방법이 있다면. 이 경우 GetMethods 메서드를 사용하고 올바른 메서드를 직접 결정해야합니다.

+0

감사합니다. 귀하의 제안이 도움이되었습니다. –

3

도움을 주신 여러분 감사합니다 !!

내가 말했던 것처럼 (즉 FOO) 메소드가 오버로드되었습니다. 나는 GetMethod()를 제대로 사용하지 않았다. 이제 GetMethods() 함수를 사용하여 솔루션을 찾았습니다.

다음과 같이 코드를 변경하고 작동했습니다. !!

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

이 올바른 솔루션입니다.

ASCX (프론트 엔드) Bio라는 BioX라는 텍스트 요소가 목록보기에 Bio라는 데이터 요소가되었습니다. < % # DataBinder.Eval (Container.DataItem, "Bio") %> 및 나는 .CS에서 문자열 변수 Bio를 명명했다.

빌드 오류 또는 "수정"이 없지만 런타임에 오류가 발생했습니다. 변수의 이름을 다르게 변경하면 오류가 사라집니다. 코드를 작성한 프로그래머는 BioTxt와 같은 명명 규칙을 따르지 않았습니다. 이렇게하면 오류가 제거됩니다.

0

감사합니다 :가 과부하이고 매개 변수없이 메소드를 호출 할 경우

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"); 
관련 문제