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

23

我最近安装了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)中,有时候如果某个包在解决方案的任何地方被使用,我需要将所有包及其依赖项安装到入口项目中,否则会出现运行时错误。 - JamesFaix
我有两个项目,一个是控制台应用程序,另一个是带有nunit的测试项目。测试引用了控制台应用程序,两者都是.NET 4.7.2版本,并且都引用了System.Threading.Tasks.Extensions。 - Ismail
刚刚创建了一个新的控制台应用程序 .net core 2.2,运行良好。 - Ismail
我需要升级一个不同的NuGet依赖项,因为它要求比我的项目安装的版本更早的版本。 - Subjective Reality
9个回答

19
今天我在一个多项目的解决方案中遇到了同样的问题,Autofac包嵌入后安装了System.Threading.Tasks.Extensions。在两个项目中通过nuget卸载和重新安装Autofac后,两个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>

你所说的“embedding”是什么意思? - StayOnTarget
@StayOnTarget:嵌入 = 通过Nuget安装。 - IngoB
你救了我的一周!! :) - Majid Shahmohammadi
添加绑定重定向是我的解决方案 :) 谢谢 :) - canvee
我也曾引用过 Autofac,但对我来说,解决方案是从我的 app.config 中删除上述绑定重定向。 - dtwk2

8

在一个多项目解决方案中升级 .net 版本时,我遇到了这个问题。在我的情况下,在 Package Manager Console 中运行 Update-Package -reinstall 命令解决了这个问题。


2
我发现使用标志“-ProjectName”可以只针对一个项目进行目标定位,而不是整个解决方案。 - J.J

4
根据https://github.com/JoshClose/CsvHelper/issues/1462,这似乎是CSVHelper 15.0.0 依赖项中的一个错误。 15.0.0版本(不确定早期版本)引入了一些其他程序集,导致出现问题。
个人通过降级到13.0来解决了此问题(一条评论也指出12.3.2可以工作),但该错误报告现在指出他们已经发布了15.0.1以专门解决此问题。 我还没有自己确认。

1
安装CSVHelper v19.0.0解决了我的问题。非常感谢,要是诊断起来会很麻烦。 - smirkingman

3

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

我怀疑最初它出了问题是因为我安装了一个非常旧的带Excel插件的csvhelper库。尽管我已经将其删除并且删除了所有引用,但它仍然会从某个地方获取此库。


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
你需要引用dll文件,然后在运行时就可以正常工作了。 - Tommy Finnegan
1
privatePath是bin\吗?(我的应用程序是Web NET Framework 4.8) - Kiquenet

1
今天在一个多项目的解决方案中遇到了这个问题。通过更新其他引起问题的项目中的NuGet包来解决它。不幸的是,我不确定哪一个修复了问题。
CsvHelper的当前版本为15.0.5。

1
在我的情况下,我的单元测试项目中的System.Threading.Tasks.Extensions版本与我的主项目不同,因此在我将我的单元测试项目升级以匹配该版本后,它对我起作用了。

这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - コリン

0

本答案假设您正在使用PackageReference来引用NuGet。如果是这种情况,那么在PackageReference .Net工具模型中也存在已知的bug。对于一些奇怪的情况,当应该放置lib程序集时,nuget restore msbuild工具链会放置ref程序集。如何确定是否遇到类似问题?您可以使用标准的反射应用程序,如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
运行控制台应用程序(.NET Framework 4.7.2)时,我遇到了这个错误。该应用程序使用了一个“本地”类库,而该类库又使用了System.Threading.Tasks.Extensions dll。将类库从控制台应用程序中移除,然后再重新添加,问题就解决了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接