【问题标题】:Could not load file or assembly 'System.Threading.Tasks.Extensions, Version=4.2.0.0无法加载文件或程序集'System.Threading.Tasks.Extensions,版本 = 4.2.0.0
【发布时间】:2020-02-12 17:53:50
【问题描述】:

我最近安装了 CsvHelper (https://joshclose.github.io/CsvHelper/),当我尝试使用该库时出现以下错误:

无法加载文件或程序集“System.Threading.Tasks.Extensions, Version=4.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)

在我的 app.config 中,我有绑定重定向:

 <dependentAssembly>
            <assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" />
        </dependentAssembly>

在我的项目中我也参考了

\packages\System.Threading.Tasks.Extensions.4.5.3\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll

它的版本是 4.2.0.1 我不知道为什么它还在尝试加载 4.2.0.0 的库。

我的项目正在运行 .net 4.7.2

【问题讨论】:

  • 这是单项目解决方案,还是多项目解决方案?我在 Framework(不是 Core)中注意到,如果在解决方案中的任何地方使用它们,有时我需要将所有包及其依赖项安装到入口点项目中,否则我会遇到运行时错误。
  • 我有 2 个项目,一个控制台应用程序,另一个是带有 nunit 的测试项目。测试引用控制台一个都是 .net 4.7.2 都引用 System.Threading.Tasks.Extensions
  • 刚刚创建了新的控制台应用程序 .net core 2.2 并且工作正常。
  • 我需要升级一个不同的 nuget 依赖项,该依赖项需要比我的项目安装的版本更早的版本。

标签: c# csvhelper assembly-binding-redirect assemblybinding


【解决方案1】:

我今天在多项目解决方案中遇到了同样的问题,System.Threading.Tasks.Extensions 是通过嵌入 Autofac 包安装的。在两个项目中删除并重新安装 Autofac(通过 nuget)后,两个 packages.config 包含相同的条目

<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net472" />

但是当一个项目引用了正确的 dll 时

packages\System.Threading.Tasks.Extensions.4.5.4\lib

另一个引用了旧版本

packages\System.Threading.Tasks.Extensions.4.5.2\lib

从引用中手动删除旧的 dll(不是通过 nuget)并嵌入正确的 dll 后,一切都恢复了。我不明白为什么正确的 packages.config 条目没有强制执行正确的引用。

编辑:

如果它在您的开发机器上运行但在您部署到的机器上运行,请不要忘记在 web.config / app.config 中部署绑定重定向。就我而言,它们看起来像这样:

<dependentAssembly>
  <assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" />
</dependentAssembly>

【讨论】:

  • “嵌入”是什么意思?
  • @StayOnTarget:嵌入 = 通过 Nuget 安装。
  • 你拯救了我的一周!! :)
【解决方案2】:

升级 .net 版本时,我在多项目解决方案中遇到了这个问题。在我的情况下,在包管理器控制台中运行 Update-Package -reinstall 命令解决了这个问题。

【讨论】:

  • 我发现标志 -ProjectName 仅针对我的一个项目而不是整个解决方案很有用
【解决方案3】:

根据https://github.com/JoshClose/CsvHelper/issues/1462,这似乎是 CSVHelper 15.0.0 dependencies 之一中的错误。 15.0.0 版本(不确定早期版本)引入了一些导致问题的其他程序集。

我个人通过降级到 13.0 来解决此问题(评论还指出 12.3.2 有效),但该错误报告现在指出他们已专门发布 15.0.1 来解决此问题。我自己还没有确认。

【讨论】:

  • 安装 CSVHelper v19.0.0 为我解决了这个问题。非常感谢,诊断起来会很痛苦。
【解决方案4】:

所以我创建了一个新的 .NET 472 项目,然后添加了所有库等和代码,现在它可以工作了。

我怀疑它最初坏了是因为我安装了一个非常旧版本的 csvhelper lib 和 excel 插件。即使我删除了它并删除了所有引用,它仍然从某个地方捡起它。

【讨论】:

    【解决方案5】:

    我今天在多项目解决方案中遇到了这个问题。通过更新有问题的项目中的其他 NuGet 包来修复它。不幸的是,不确定是哪一个解决了这个问题。

    CsvHelper 的当前版本:15.0.5。

    【讨论】:

      【解决方案6】:
      <assemblyBinding>
        <probing privatePath="System.Threading.Tasks.Extensions.dll"/>
      </assemblyBinding>
                  <assemblyBinding>
        <probing privatePath="System.Runtime.CompilerServices.Unsafe.dll"/>
      </assemblyBinding>
          <assemblyBinding>
        <probing privatePath="Microsoft.Bcl.AsyncInterfaces.dll"/>
      </assemblyBinding>
      

      【讨论】:

      • 你需要引用 dll 文件然后所有将在运行时工作
      • privatePath 是 bin\ ? (我的应用是 web NET Framework 4.8)
      猜你喜欢
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多