通过反射调用动态加载的DLL方法,但目标引用DLL

时间:2013-10-25 10:00:00

标签: c# .net reflection 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以外的引用,它们仍然会导致问题。

1 个答案:

答案 0 :(得分:2)

Assembly.LoadFile不解析导致您描述的异常的依赖项。使用LoadLoadFrom可以解决您的问题。