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

简介: 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():不能用于加载标识相同但路径不同的程序集。

 


相关文章
|
存储 开发框架 架构师
【深入理解CLR 六】基元类型、引用类型和值类型
【深入理解CLR 六】基元类型、引用类型和值类型
85 0
反编译报错 using 语句中使用的类型必须可隐式转换为“System.IDisposable“
反编译报错 using 语句中使用的类型必须可隐式转换为“System.IDisposable“
|
C++
VS Newtonsoft的引用问题
VS Newtonsoft的引用问题
148 0
|
安全 编译器 C++
C++类型强制转换:隐式转换和显式转换(包含Qt智能指针类型转换)
C++类型强制转换:隐式转换和显式转换(包含Qt智能指针类型转换)
805 0
|
Java 数据格式 XML
EMF介绍系列(四、枚举类型、自定义类型和Map)
除了普通的类(接口)以外,在类图里可以定义一些特殊的元素,比较常见的是枚举类型、自定义类型,它们对于一个完整可用的模型也是必不可 少的,这篇帖子主要介绍EMF里它们的使用方法。另外,由于EMF对Map的支持比较特别,所以在这里也简要介绍一下Map类型的定义方法。
1373 0