2013-10-25 94 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应用程序,但该类只是一个非常通用的通用服务类。

我不想在目标中使用类似预处理器语句的东西;像

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

但我知道这是没有道理的,因为它不是在那个阶段,我怎么能避免这个问题?

将log4net引用添加到调用者项目并不能真正解决问题。这意味着如果我有一些除log4net之外的引用,它们仍然会导致问题。

+0

在Web服务器上烦恼这件事从来没有任何意义。这不像你有第三方可以或不可以将软件复制到服务器上。只需部署你需要的组件,问题就解决了。 –

+0

@HansPassant我不知道我是否跟着你:)。这里的事情是,我有很多MyDLL,它们都可能引用不同的第三方DLL,当我更新MyDLL时,其中一些可能会引用新的第三方DLL,比如压缩备份或用于Delta差异备份的DLL。还有一些包含相同的压缩DLL在不同的版本,我也很懒,我不想更新调用者程序,我想忘记它,让它生成电子邮件报告,并没有失败,当我更新我的各种网站。也许我太懒惰了,是的...好点:p。 – Nenotlep

回答

2

Assembly.LoadFile不能解决导致您描述的异常的依赖关系。使用LoadLoadFrom应该可以解决您的问题。

+0

Awesomesauce,完全工作。 – Nenotlep