这两天做项目整理,把第三方调用,整合成动态加载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():不能用于加载标识相同但路径不同的程序集。