关于c#程序集搜索Dll目录问题

问题:我在一个程序集中动态加载一个Dll。而这个Dll中去反序列化它的配置信息。每次都是在反序列化时出错,错误信息如下:

+ InnerException {"无法将类型为“System.Collections.Generic.List`1[Com.Shengzuo.CommonalityDataSource.ConfigInfo]”的对象强制转换为类型“System.Collections.Generic.List`1[Com.Shengzuo.CommonalityDataSource.ConfigInfo]”。"} System.Exception {System.InvalidCastException}

解决:是我在程序集的根目录和子目录下分别放置Dll这时程序集认为这个类型是存在于两个Dll为不同的类型不能强制转换。

根源在于:程序集查找Dll时根目录要优先于其它目录。

 

 

开始绑定

当运行库试图解析对另一个程序集的引用时,就开始进行定位并绑定到程序集的进程。该引用可以是静态的,也可以是动态的。在生成时,编译器在程序集清单的元数据中记录静态引用。动态引用是由于调用各种方法而动态构造的,例如 System.Reflection.Assembly.Load 方法。

引用程序集的首选方式就是使用完全引用,包括程序集名称、版本、区域性和公钥标记(如果存在)。运行库就会按照本节后面描述的步骤,使用这些信息来定位程序集。无论引用是对静态程序集的引用还是对动态程序集的引用,运行库均使用相同的解析过程。

还可通过向调用方法仅提供有关程序集的部分信息的方式(例如仅指定程序集名称),对程序集进行动态引用。在这种情况下,仅在应用程序目录下搜索程序集,不进行其他检查。使用加载程序集(如 System.Reflection.Assembly.LoadSystem.AppDomain.Load)的各种方法中的一种进行部分引用。

最后,您可以使用诸如 System.Reflection.Assembly.Load 之类的方法进行动态引用并只提供部分信息;然后在应用程序配置文件中用 <qualifyAssembly> 元素限定该引用。该元素使您可以在应用程序配置文件中而不是在代码中提供完全引用信息(名称、版本、区域性,如果适用还有公钥标记)。如果要在应用程序目录外完全限定对某个程序集的引用,或者如果要引用全局程序集缓存中的程序集,但又希望方便地在配置文件中而不是在代码中指定完全引用,就可以采用这一技术。

 

 

转载于:https://www.cnblogs.com/ZlgHimm/archive/2008/12/03/Net.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值