我需要动态调用一堆也是我的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应用程序,但该类只是一个非常通用的通用服务类。
我不想在目标中使用类似预处理器语句的东西;像
#if REFLECTION
Log.Info("Aww right, Princess!");
#endif
但我知道这是没有道理的,因为它不是在那个阶段,我怎么能避免这个问题?
将log4net引用添加到调用者项目并不能真正解决问题。这意味着如果我有一些除log4net之外的引用,它们仍然会导致问题。
在Web服务器上烦恼这件事从来没有任何意义。这不像你有第三方可以或不可以将软件复制到服务器上。只需部署你需要的组件,问题就解决了。 –
@HansPassant我不知道我是否跟着你:)。这里的事情是,我有很多MyDLL,它们都可能引用不同的第三方DLL,当我更新MyDLL时,其中一些可能会引用新的第三方DLL,比如压缩备份或用于Delta差异备份的DLL。还有一些包含相同的压缩DLL在不同的版本,我也很懒,我不想更新调用者程序,我想忘记它,让它生成电子邮件报告,并没有失败,当我更新我的各种网站。也许我太懒惰了,是的...好点:p。 – Nenotlep