zoukankan      html  css  js  c++  java
  • 未能加载文件或程序集“”或它的某一个依赖项。系统找不到指定的文件

    连续两天都为这个运行时错误“类型初始值设定项引发异常”而烦恼,调试也不知道哪里出了问题。上网Google一下,一大堆相同的问题,可是按照那些方法折腾来折腾去,问题还是一样。最后在CSDN上发帖子问了,果然“重赏之下必有勇夫”,很快就有高手回复了,问题也随着解决了。哈哈。在此写个随笔,以后如果大家遇到类似问题,也可参考一下,自己也做个备忘,不然放在电脑上,又找不到,我的电脑文件到处乱放,有时连我自己都找不到^_^。
      问题是这样嘀:
      项目采用了三层架构和工厂模式,并借鉴了PetShop的架构,因为这个项目也是采用分布式的数据库,目前只有三个数据库,主要出于提高访问性能考虑。
      原来是按照网上对PetShop的介绍来给各项目添加引用的。
      1、Web 引用 BLL。
    2、BLL 引用 IDAL,Model,使用DALFactory创建实例。
    3、IDAL 引用 Model。  

    在编程中,使用反射(IoC)是一个很好的架构。在.Net中,System.Reflection命名空间提供了对反射的支持。然而,很多朋友在使用Assembly.Load()方法时,却不能正确装载程序集。比如,很多朋友在模仿PetShop的框架时,使用这样的调用方式:

    未能加载文件或程序集鈥溾澔蛩哪骋桓鲆览迪睢O低痴也坏街付ǖ奈募string assemblyName = ConfigurationManager.AppSettings["webDAL"];
    未能加载文件或程序集鈥溾澔蛩哪骋桓鲆览迪睢O低痴也坏街付ǖ奈募string constructor = ConfigurationManager.AppSettings["constructorClass"];
    未能加载文件或程序集鈥溾澔蛩哪骋桓鲆览迪睢O低痴也坏街付ǖ奈募 return (IExample)Assembly.Load(assemblyName).CreateInstance(constructor, false);
    未能加载文件或程序集鈥溾澔蛩哪骋桓鲆览迪睢O低痴也坏街付ǖ奈募

    然而,在Assembly.Load()方法处,经常出现未能加载程序集的错误:

    未能加载文件或程序集“webDAL”或它的某一个依赖项。系统找不到指定的文件

    Assembly.Load(assemblyName)实际上是在assemblyName.dll文件中查找类custructor的定义。例如,Assembly.Load("PetShop.SQLServerDAL").CreateInstance("PetShop.SQLServerDAL.Cateogry"),就是在PetShop.SQLServerDAL.dll程序集中查找PetShop.SQLServerDAL.Category类。而在自己定义类库时,往往忽视了生成的程序集的名称。

    在类库项目上点击右键->属性,可以设定生成的程序集的文件名。只有正确设置了,才能在Assembly.Load(assemblyName)方法中避免找不到程序集的错误。

    错误描述:未能加载文件或程序集“SQLServerDAL”或它的某一个依赖项。文件不存在。
    原因:1.在利用分层设计思想开发时,关于动态反射的理解不清晰。
    2.由于开发工具的bug问题,造成未能加载程序集。
    解决方案:
    1.反射编程要求在网站的Bin文件夹中有已经编译好的.DLL文件(即保持DLL文件存在),并且保持名称和编译前类库的名称一致。可称:添加引用性。
    2.查看网站中的项目(类库)属性,确认是否默认命名空间和程序集名称以及Bin文件夹下的DLL文件名称是否一致,不一致则会出现未能加载文件或者程序集,所以的修改项目的属性。可称:名称一致性。
    3.建议在编程的时在创建类库的时候写上系统名称+项目名称,能够有效的避免Bug产出。即:SystemName.Model或者SystemName.IDAL。eg:BBS.Model。可称:名称完整性。
    Assembly.Load(path) 其中这个path是加载你项目web下bin目录的程序集,也就是说你要反射的程序集在你的web的bin下一定要有,看看你引用没有呢????
          4、Model 无引用。
    5、DALFactory 引用IDAL,通过读取web.config里设置的程序集,加载类的实例,返回给BLL使用。
    6、SQLServerDAL 引用 Model和IDAL,被DALFactory加载的程序集,实现接口里的方法。
    问题就出在这里了。顶!
    按照PetShop的架构,是DALFactory程序集里通过反射创建针对特定数据访问层里的对应类实例,这样BLL调用接口时就知道调用这个对应类实例里的实现方法。
    而反射动态加载程序集是通过这种方法 Assembly.Load("程序集").CreateInstance("命名空间.类"),其中的“程序集”读取的是Web层bin文件夹下对应的dll,即反射加载的程序集dll在Web层的bin文件夹必须有,不然就会出现如题的错误。问题解决了~^_^
    出现这种错误的另两种情况,这也是在网上看到的,一起写下来。
    一、Web.config配置错误。
    在DALFactory程序集里的DataAccess类里,通过
    private static readonly string path = ConfigurationManager.AppSettings["WebDAL"];
    来获得程序集的名称的。
    在Web.config里我的配置如下:
       <appSettings>
    <add key="WebDAL" value="PDMS.SQLServerDAL"/>
    </appSettings>
    二、程序集名称和默认命名空间错误。
    在各个程序集右键--属性,看看程序集名称和默认命名空间有没有写错。这个问题也可能导致如题的错误~~
    第一次用反射,就出了这个问题,学到不少,还得加深对反射的理解^_^

  • 相关阅读:
    (转)MapReduce源码分析总结
    Linux SSH远程文件/目录传输命令scp
    Hadoop学习总结:MapReduce的过程解析
    Python 3 的新特性zz
    Tutorial Learn Python in 10 minutes[zz]
    Hadoop学习总结:Hadoop的运行痕迹
    Python 绝对简明手册
    Linux命令总结
    [Error] 'strlen' was not declared in this scope
    养成C#编程好习惯
  • 原文地址:https://www.cnblogs.com/richzhang/p/3055333.html
Copyright © 2011-2022 走看看