1

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

4

1 回答 1

2

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

于 2013-10-25T10:25:26.427 回答