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

 


相关文章
|
3月前
|
传感器 开发框架 JSON
聊聊 C# dynamic 类型,并分享一个将 dynamic 类型变量转为其它类型的技巧和实例
聊聊 C# dynamic 类型,并分享一个将 dynamic 类型变量转为其它类型的技巧和实例
139 0
|
存储 开发框架 架构师
【深入理解CLR 六】基元类型、引用类型和值类型
【深入理解CLR 六】基元类型、引用类型和值类型
85 0
反编译报错 using 语句中使用的类型必须可隐式转换为“System.IDisposable“
反编译报错 using 语句中使用的类型必须可隐式转换为“System.IDisposable“
|
安全 编译器 C++
C++类型强制转换:隐式转换和显式转换(包含Qt智能指针类型转换)
C++类型强制转换:隐式转换和显式转换(包含Qt智能指针类型转换)
804 0
Variant类型在各语言中的参数传递
几年前我用VB开发了一个西门子PPI通信控件,由于VB开发的控件是标准的COM组件,所以想当然的认为VC、C#、Delphi等开发语言可以非常容易的使用。
575 0