2013-10-25 1 views
1

광산 인 DLL 묶음에서 동적으로 메서드를 호출해야합니다. 알 수없는 양의 DLL이 호출되며 서로 다른 버전 일 수 있습니다. 동적으로 각 DLL을로드하고 리플렉션을 사용하여 정적 메서드를 호출합니다. 이리플렉션을 통해 동적으로로드 된 DLL 메서드를 호출하지만 대상이 DLL을 참조합니다.

foreach (var myThing in instances) 
{ 
    try { 
     Assembly a = Assembly.LoadFile(myThing.DllPath); 
     Type t = a.GetType("MyNamespace.Services"); 
     MethodInfo m = t.GetMethod("Backup"); 
     bool b = (bool)m.Invoke(null, new object[] { "Autobackup"+date+".zip", "Bot" }); 
    } catch (Exception e){ 
     LogInternalExceptions(e); // recursively vomit e.InternalException into logs 
    } 
} 

문제는 Backup 방법은 다른 DLL (log4net)를 참조하는 정적 클래스에 살고 있다는 것입니다처럼 기본적으로 내 코드 보인다.

public static class Services 
{ 
    private static ILog Log = LogManager.GetLogger(typeof(Services)); 

    public static bool Backup(string filename, string comment) 
    { 
     // ... snip ... 
     Log.Info("Aww right, Princess!"); 
     return true; 
    } 
} 

따라서 예상 오류 Could not load file or assembly 'log4net, ...' or one of its dependencies. File not found.가 표시됩니다.

나는 이것이이 방법에 관한 나의 유일한 문제가 아니라고 확신하지만, 그것은 첫 번째 문제이며 나는 혼란 스럽다. 발신자 또는 대상 코드를 편집 할 수는 있지만 실제로는 모르겠습니다. 대상은 Asp.net MVC3 응용 프로그램이지만 클래스는 꽤 ​​일반적인 범용 서비스 클래스입니다.

대상에서 전 처리기 명령문과 같은 것을 사용하려고합니다. something like

#if REFLECTION 
Log.Info("Aww right, Princess!"); 
#endif 

하지만 그 단계에서는 아니기 때문에 그 의미가 아니라는 것을 알고 있습니다. 어떻게이 문제를 피할 수 있습니까?

log4net 참조를 호출자 프로젝트에 추가해도 실제로 큰 그림은 해결되지 않습니다. log4net이 아닌 다른 참조가 있으면 문제가 계속 발생한다는 것을 의미합니다.

+0

웹 서버에서이 문제에 대해 걱정할 필요가 없습니다. 서버에 소프트웨어를 복사하거나 복사하지 않을 수있는 제 3자를 가진 것은 결코 아닙니다. 필요한 어셈블리 만 배포하면 문제가 해결됩니다. –

+0

@HansPassant 내가 너를 따라 왔는지 확신 할 수 없다. :) 여기서 중요한 것은 다른 모든 타사 DLL을 참조 할 수있는 많은 MyDLL이 있고 MyDLL을 업데이트 할 때 일부는 델타 차이 백업을위한 백업 또는 DLL 압축과 같은 새로운 타사 DLL을 참조 할 수 있습니다. 또한 그들 중 일부는 다른 버전의 동일한 zip DLL을 포함하고 있으며 호출자 프로그램을 업데이트하고 싶지 않아서 게으르다. 잊어 버리고 이메일 보고서를 생성하기 위해 남겨두고 싶지 않다. 내 다양한 ​​사이트를 업데이 트하십시오. 어쩌면 나는 너무 게으르다, 예 ... 좋은 지적 : p. – Nenotlep

답변

2

Assembly.LoadFile은 사용자가 설명하는 예외로 이어지는 종속성을 해결하지 않습니다. Load 또는 LoadFrom을 사용하면 문제를 해결할 수 있습니다.

+0

굉장히 좋은, 전적으로 일했습니다. – Nenotlep

관련 문제