我需要在一堆也是我的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应用程序,但该类只是一个非常通用的通用服务类。
我想在目标中使用类似预处理器语句的东西;
之类的东西#if REFLECTION
Log.Info("Aww right, Princess!");
#endif
但我知道这没有道理,因为它不在那个阶段,我怎么能避免这个问题呢?
将log4net引用添加到调用者项目并不能解决问题。这意味着如果我有一些除log4net以外的引用,它们仍然会导致问题。