zoukankan      html  css  js  c++  java
  • 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:WindowsMicrosoft.NETFrameworkv4.0.30319Temporary ASP.NET Filesvs5e9daf8a2fa7d2c6assemblydl3bafeaa7a3d3388b_afcad501TLSC.External.Realize.CostSynergy.SD.dll”位置处)。类型 B 源自“TLSC.External.Realize.CostSynergy.SD, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”(在上下文“LoadNeither”中的“F:项目NewBaseTLSC2.PresentationTLSC.Api.Admin\binTLSC.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():不能用于加载标识相同但路径不同的程序集。
     

  • 相关阅读:
    android sdk里的各目录作用
    android广播接收器
    Android 服务
    全球10个智慧城市应用案例
    大数据应用蓝皮书:未来涉及5个热点领域
    2018杭州-云栖大会
    上海世界人工智能大会大佬观点
    2018世界人工智能大会
    大数据安全
    2018第37周六
  • 原文地址:https://www.cnblogs.com/jincieryi/p/12679893.html
Copyright © 2011-2022 走看看