反射 - 加载依赖装配的麻烦

时间:2015-12-15 07:01:52

标签: c# .net reflection

我正在尝试执行下面的代码,以查看程序集是在Debug或Release模式下构建的。

Assembly assemb = Assembly.LoadFile(fileName);
bool isDebug = false;
foreach (object att in assemb.GetCustomAttributes(false))
    if (att is DebuggableAttribute)
        isDebug = ((DebuggableAttribute)att).IsJITTrackingEnabled;
Console.WriteLine("Assembly is {0}.", isDebug ? "debug" : "release");

我可以毫无问题地加载程序集(Product.dll)。但是当我尝试执行GEtCustomAttributes(false)方法时,我得到的是异常消息。

  

无法加载文件或程序集' log4net,版本= 1.2.11.0,   Culture = neutral,PublicKeyToken = null'或其中一个依赖项。该   系统找不到指定的文件。

不知道为什么要寻找依赖装配。是因为构建Product.dll的方式(如优化或其他方式)。我无法访问Product.dll的源代码,所以不确定如何提交其模式(调试或发布)

2 个答案:

答案 0 :(得分:3)

通常,依赖的DLL不会编译到生成的DLL中。这意味着如果Product.dll编译时依赖于log4net.dll,则必须位于同一文件夹中。
应该可以简单地将log4net.dll复制到Product.dll所在的同一文件夹中。

如果Product.dll中定义的类型引用log4net.dll中定义的类型,则必须加载依赖项。在这种情况下,我强烈怀疑它是Logger / ILog,因为通常会包含此行以获取Logger

private static readonly log4net.ILog log = log4net.LogManager.GetLogger();

答案 1 :(得分:0)

如果log4net是您引用项目的必需(意思是直接引用)程序集,您还必须加载它,则无法仅加载程序集的部分。话虽如此,如果缺少log4net.dll,引用程序集的代码可能不会编译,所以它可以以任何方式加载它。

无论如何,在引用的程序集中定义的任何属性都需要来自Logger的{​​{1}},因此它将搜索该类型。

log4net assembly放入构建路径中,它应该可以正常工作。