광산 인 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이 아닌 다른 참조가 있으면 문제가 계속 발생한다는 것을 의미합니다.
웹 서버에서이 문제에 대해 걱정할 필요가 없습니다. 서버에 소프트웨어를 복사하거나 복사하지 않을 수있는 제 3자를 가진 것은 결코 아닙니다. 필요한 어셈블리 만 배포하면 문제가 해결됩니다. –
@HansPassant 내가 너를 따라 왔는지 확신 할 수 없다. :) 여기서 중요한 것은 다른 모든 타사 DLL을 참조 할 수있는 많은 MyDLL이 있고 MyDLL을 업데이트 할 때 일부는 델타 차이 백업을위한 백업 또는 DLL 압축과 같은 새로운 타사 DLL을 참조 할 수 있습니다. 또한 그들 중 일부는 다른 버전의 동일한 zip DLL을 포함하고 있으며 호출자 프로그램을 업데이트하고 싶지 않아서 게으르다. 잊어 버리고 이메일 보고서를 생성하기 위해 남겨두고 싶지 않다. 내 다양한 사이트를 업데이 트하십시오. 어쩌면 나는 너무 게으르다, 예 ... 좋은 지적 : p. – Nenotlep