C# Assembly.LoadFile [A] 无法强制转换为 [B]

这两天做项目整理,把第三方调用,整合成动态加载dll的方式。

用的是C#  Assembly.LoadFile,调用的时候报错了。

报错信息如下:

   [A]TLSC.External.Realize.CostSynergy.SD.EASLoginService.WSContext 无法强制转换为 [B]TLSC.External.Realize.CostSynergy.SD.EASLoginService.WSContext。类型 A 源自“TLSC.External.Realize.CostSynergy.SD, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”(在上下文“Default”中的“C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\vs\5e9daf8a\2fa7d2c6\assembly\dl3\0bafeaa7\a3d3388b_afcad501\TLSC.External.Realize.CostSynergy.SD.dll”位置处)。类型 B 源自“TLSC.External.Realize.CostSynergy.SD, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”(在上下文“LoadNeither”中的“F:\项目\NewBase\TLSC\2.Presentation\TLSC.Api.Admin\\bin\TLSC.External.Realize.CostSynergy.SD.dll”位置处)。

原因是:两个名字相同路径不同的程序集创建的对象不相同无法转换。

解决办法:把Assembly.LoadFile 换成  Assembly.LoadFrom

区别:
1、Assembly.LoadFile只载入相应的dll文件,比如Assembly.LoadFile("a.dll"),则载入a.dll,假如a.dll中引用了b.dll的话,b.dll并不会被载入。
Assembly.LoadFrom则不一样,它会载入dll文件及其引用的其他dll,比如上面的例子,b.dll也会被载入。


2、用Assembly.LoadFrom载入一个Assembly时,会先检查前面是否已经载入过相同名字的Assembly,比如a.dll有两个版本(版本1在目录1下,版本2放在目录2下),程序一开始时载入了版本1,当使用Assembly.LoadFrom("2\\a.dll")载入版本2 时,不能载入,而是返回版本1。
Assembly.LoadFile的话则不会做这样的检查,比如上面的例子换成Assembly.LoadFile的话,则能正确载入版本2。

LoadFile():加载指定路径上的程序集文件的内容。 
LoadFrom(): 根据程序集的文件名加载程序集文件的内容。

区别:

LoadFile(): 方法用来加载和检查具有相同标识但位于不同路径中的程序集.但不会加载程序的依赖项。

LoadFrom():不能用于加载标识相同但路径不同的程序集。
 

posted @ 2020-01-14 16:55  仅此而已。  阅读(481)  评论(0编辑  收藏  举报