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> 二、程序集名称和默认命名空间错误。 在各个程序集右键--属性,看看程序集名称和默认命名空间有没有写错。这个问题也可能导致如题的错误~~ 第一次用反射,就出了这个问题,学到不少,还得加深对反射的理解^_^

  • 相关阅读:
    如何使用SAP Intelligent Robotic Process Automation自动操作Excel
    OpenSAML 使用引导 IV: 安全特性
    Spring Cloud Zuul 网关使用与 OAuth2.0 认证授权服务
    微服务架构集大成者—Spring Cloud (转载)
    Spring Cloud Eureka 服务注册列表显示 IP 配置问题
    使用 Notification API 开启浏览器桌面提醒
    SignalR 中使用 MessagePack 序列化提高 WebSocket 通信性能
    配置 Nginx 的目录浏览功能
    关于 Nginx 配置 WebSocket 400 问题
    Migrate from ASP.NET Core 2.0 to 2.1
  • 原文地址:https://www.cnblogs.com/liuyuanhao/p/3092685.html
Copyright © 2011-2022 走看看