【问题标题】:Type A DLL cannot be cast to type B DLL. Type A originates.. from in the context LoadFromA 类 DLL 不能转换为 B 类 DLL。类型 A 源自.. from 在上下文 LoadFrom
【发布时间】:2015-04-30 22:29:27
【问题描述】:

我正在尝试使用 TestProject 在 Visual Studio 中测试第三方 API。我收到错误。我在测试项目和业务逻辑项目中引用了第 3 个 API。现在我将测试数据从测试项目传递到业务逻辑项目,出现以下错误。

[A]TIMSS.API.User.UserDefinedInfo.UserDefinedCustomerTechnicalDisciplinees 无法转换为 [B]TIMSS.API.User.UserDefinedInfo.UserDefinedCustomerTechnicalDisciplinees。类型 A 源自 'TIMSS.API.User, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 在位置 'C:\Svad\Trunk\Source\EBusiness\EBusiness.Test\bin 的上下文 'LoadFrom' 中\bin\TIMSS.API.User.dll'。类型 B 源自 'TIMSS.API.User, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 在位置'C:\Svadlakonda\Srikanth\Trunk\Source\EBusiness\EBusiness.Test 的上下文'Default' \bin\TIMSS.API.User.dll'。

这里有什么问题?我尝试将测试项目引用的 DLL 设置为 Copy Localfalse,反之亦然。

【问题讨论】:

  • 似乎正在尝试在两个项目中加载 dll。尝试仅在您特别需要的项目中引用,然后在其他项目中引用子项目。基本上类似于 TestProject > Business Logic > API。它还试图从不同的位置复制。
  • 看起来您正在LoadFrom 上下文中加载和组装(可能使用Assembly.LoadFrom())。 LoadFrom 上下文中的类型不能转换为/从默认上下文中的类型转换。您是否有理由需要使用 LoadFrom 上下文?
  • 您正在为两个项目的同一个程序集引用不同的二进制文件:C:\Svad\Trunk\Source\EBusiness\EBusiness.Test\bin\bin\TIMSS.API.User.dllC:\Svadlakonda\Srikanth\Trunk\Source\EBusiness\EBusiness.Test\bin\TIMSS.API.User.dll 您应该修复项目中的引用,以便仅引用这两个中的一个,或者如果动态加载:确保从同一位置加载。

标签: c# .net visual-studio visual-studio-2012


【解决方案1】:

假设两个程序集(项目引用的一个和使用 LoadFrom 加载的一个)中的类型确实相同(或可转换),将“LoadFrom”程序集加载到应用程序域中应该可以解决问题。这可能不是线程安全的,但值得一试。

// This can cause "A cannot be cast to B" errors even using two exact copies of the same DLL.
var uncastableAssembly = Assembly.LoadFrom(filename);

// This shoud solve the casting issue but there still could be other issues.
var castableAssembly = AppDomain.CurrentDomain.Load(Assembly.LoadFrom(filename).GetName());

【讨论】:

  • 这个 ^^ 如果您使用的是使用反射的 IIS express 和参考包。
【解决方案2】:

目标框架差异:

我的错误是由于加载的程序集的目标框架版本(例如 4.5.2)低于它所引用的另一个版本(例如 4.6.1)

【讨论】:

  • 这也是我的问题。我不能足够强调这个问题有多烦人。我发现了很多关于可能发生的事情的神秘答案,而且解决方案更加神秘。 感谢@Declan Taylor!
【解决方案3】:

我遇到了这个错误,唯一能解决的就是安装 Microsoft .NET Framework 4.5.2(离线安装程序) https://www.microsoft.com/en-us/download/details.aspx?id=42642

我之前还安装了 SQL Server 2014 客户端工具,通过安装更新​​的 msxml 6.0 版本,这也可能产生了积极影响。

我的错误信息是:

[A]xx.xxxx.ClassUserDS 不能转换为 [B]xx.xxxx.ClassUserDS。类型 A 源自 'yyyyyy, Version=3.0.5617.31787, Culture=neutral, PublicKeyToken=657d68e01eb7c911' 在位置 'C:\Users\xxxxx\Appdata\Local\assembly\dl3\QQ3VBMNC.EO1\VYVECOB7 的上下文'Default'中.H5J\2b6c89d2\51158eea_9892d001\yyyyyy.DLL'。类型 B 源自 'yyyyyy, Version=3.0.5617.31787' 在位置 'C:\Users\xxxxx\Appdata\Local\Microsoft\InfoPath\FormCache4\30083E69.D18\cd264661b1055c58$b04f2786908cb791\yyyyyy.dll 的上下文 'LoadNeither'

我尝试在 regedit HKCU\Software\Microsoft\Fusion\ 中查找,但没有帮助。

我尝试重置办公室缓存,但没有帮助。

C:\Program Files (x86)\Microsoft Office\Office15\INFOPATH.EXE /cache clearall

or 64bit office 2013:
C:\Program Files\Microsoft Office\Office15\INFOPATH.EXE /cache clearall

or 64bit office 2010
C:\Program Files\Microsoft Office\Office14\INFOPATH.EXE /cache clearall

我尝试重置融合 (GAC) 缓存,但我不知道该怎么做(除了从开始菜单运行“.NET Framework 1.1 配置”来查看。)

【讨论】:

    【解决方案4】:

    当我重命名一个 aspx 页面以隐藏它时发生此错误。

    在我的例子中,我将一个名为 tutorials.aspx 的文件重命名为 tutorials-hidden.aspx。发布成功,但是当我加载 URL 时出现错误 500。通过添加 tutorials.aspx 文件然后将其从项目中删除来修复。可能在 csproj 文件中留下了一些定义。

    【讨论】:

      猜你喜欢
      • 2022-11-07
      • 2011-12-28
      • 2019-11-18
      • 2021-08-25
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 2014-12-12
      相关资源
      最近更新 更多