我需要在一堆同样属于我的 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 之外的参考资料,它们仍然会导致问题。