无法加载文件或程序集“System.Threading.Tasks.Extensions,版本=4.2.0.0

问题描述 投票:0回答:10

我最近安装了 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 etstandard2.0\System.Threading.Tasks.Extensions.dll

它的版本是 4.2.0.1 我不确定为什么它仍然尝试加载 4.2.0.0 的库。

我的项目正在运行.net 4.7.2

c# csvhelper assembly-binding-redirect assemblybinding
10个回答
20
投票

我今天在多项目解决方案中遇到了同样的问题,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>

8
投票

我在升级.net版本时在多项目解决方案中遇到了这个问题。就我而言,在包管理器控制台中运行

Update-Package -reinstall
命令解决了问题。


4
投票

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

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


3
投票

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

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


2
投票
<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>

1
投票

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

CsvHelper当前版本:15.0.5.


1
投票

就我而言,我的单元测试项目中的 System.Threading.Tasks.Extensions 版本与我的主项目不同,因此在我升级单元测试项目以匹配它为我工作的版本之后。


1
投票

在运行使用“本机”类库的控制台应用程序(.NEt Framework 4.7.2)时出现此错误,该类库又消耗了 System.Threading.Tasks.Extensions dll。从控制台应用程序中删除类库,然后重新添加,解决了问题。


0
投票

此答案假设您使用

PackageReference
作为您的 nuget 参考。如果是这种情况,则 PackageReference .Net 工具模型中也存在一个已知错误。对于一些奇怪的情况,nuget Restore msbuild 工具链会放置
ref
程序集,而它应该理想地放置
lib
程序集。如何知道您是否面临类似的问题?您可以使用 ILSpy 等标准反射器应用程序来读取工作目录中发生故障的库的元数据。如果您在其元数据中看到 RefAssemblies 属性,那么您也遇到了这个问题。

要解决此问题,您可以在

csproj
文件中使用类似以下标记的内容来解决 nuget 复制问题。

<Target Name="ReplaceRefWithLib" BeforeTargets="ResolveAssemblyReferences">
    <ItemGroup>
        <_noCopyRefs Include="@(Reference)" Condition="'%(Reference.Private)' == 'false'" />
        <_noCopyRefsByFileName Include="@(_noCopyRefs->'%(FileName)')">
            <OriginalItem>%(Identity)</OriginalItem>
        </_noCopyRefsByFileName>
        <_libByFileName Include="@(ReferenceCopyLocalPaths->'%(FileName)')">
            <OriginalItem>%(Identity)</OriginalItem>
        </_libByFileName>
        <_overlappingRefByFileName Include="@(_noCopyRefsByFileName)" Condition="'@(_noCopyRefsByFileName)' == '@(_libByFileName)' AND '%(Identity)' != ''" />
        <_overlappingLibByFileName Include="@(_libByFileName)" Condition="'@(_noCopyRefsByFileName)' == '@(_libByFileName)' AND '%(Identity)' != ''" />
        <_overlappingRef Include="@(_overlappingRefByFileName->'%(OriginalItem)')" />
        <_overlappingLib Include="@(_overlappingLibByFileName->'%(OriginalItem)')" />
    </ItemGroup>
    <ItemGroup Condition="'@(_overlappingRef)' != ''">
        <Reference Remove="@(_overlappingRef)" />
        <Reference Include="@(_overlappingLib)">
        <Private>false</Private>
        </Reference>
    </ItemGroup>
</Target>

希望这有帮助。


0
投票

对于在 C# 项目引用中新添加的几个 dll,我也遇到了类似的问题,其中我使用 .exe.config 文件进行绑定重定向。我在 .exe.config 文件中提到了旧版本和新版本,但它给出了相同的错误。 我使用此链接启用绑定重定向日志:如何在 .NET 中启用程序集绑定失败日志记录 (Fusion) 我发现有时 dll 从错误的文件夹加载(因为在多个位置具有不同版本的相同 dll 可用)或 .exe.config 中给出的错误绑定版本

示例: .exe.config 放置的文件夹路径:C:older1

System.Threading.Tasks.Extensions.dll 放置的文件夹路径:C:older1 bc\xyz

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.