DLL地狱 - 无法加载文件或程序集System.Threading.Tasks.Extensions

8

我有一个非常简单的.NET Framework 4.7.2应用程序,其中包含以下nuget包:

<packages>
  <package id="Autofac" version="5.1.2" targetFramework="net472" />
  <package id="DynamicData" version="6.14.8" targetFramework="net472" />
  <package id="Microsoft.Bcl.AsyncInterfaces" version="1.1.0" targetFramework="net472" />
  <package id="MSBuildTasks" version="1.5.0.235" targetFramework="net472" developmentDependency="true" />
  <package id="ReactiveUI" version="11.2.3" targetFramework="net472" />
  <package id="Serilog" version="2.9.0" targetFramework="net472" />
  <package id="Serilog.Enrichers.Process" version="2.0.1" targetFramework="net472" />
  <package id="Serilog.Enrichers.Thread" version="3.1.0" targetFramework="net472" />
  <package id="Serilog.Sinks.File" version="4.1.0" targetFramework="net472" />
  <package id="Splat" version="9.3.11" targetFramework="net472" />
  <package id="System.Reactive" version="4.3.2" targetFramework="net472" />
  <package id="System.Runtime.CompilerServices.Unsafe" version="4.7.0" targetFramework="net472" />
  <package id="System.Threading.Tasks.Extensions" version="4.5.3" targetFramework="net472" />
  <package id="System.ValueTuple" version="4.5.0" targetFramework="net472" />
</packages>

正如您所看到的,这里引用了版本为4.5.3System.Threading.Tasks.Extensions(我无法更改此版本,因为其他软件包依赖于它)。

当我在Visual Studio解决方案资源管理器的DLL引用属性中查看时,它显示引用了版本号为4.2.0.1的DLL,该DLL位于.....\packages\System.Threading.Tasks.Extensions.4.5.3\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll

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>

当我运行应用程序时,出现异常: 异常信息 我已经尝试更改绑定重定向为类似以下内容的东西:
   <bindingRedirect oldVersion="0.0.0.0-99.99.99.99" newVersion="4.5.3" />

但问题仍然存在。我不知道如何解决这个dll-hell问题。非常感谢任何帮助。


2
找出故障的根本原因最好的方法就是启用融合日志。我认为“或其依赖项之一”是这里的关键词组,您可以通过检查融合日志来查看实际缺失的文件:https://learn.microsoft.com/en-us/dotnet/framework/tools/fuslogvw-exe-assembly-binding-log-viewer - Oguz Ozgul
1
我尝试安装这个包,但是System.Runtime.CompilerServices.Unsafe的默认版本是4.5.2而不是4.7.0!! - Mohammed Sajid
当我检查程序集的4.5.2版本时,我看到一个有趣的程序集引用:.assembly extern System.Runtime.CompilerServices.Unsafe - Oguz Ozgul
1
packages.config中的版本号是NuGet包版本,与DLL内部的程序集版本不一定相对应。您尝试过完全删除<dependentAssembly>节点吗? - Victor Wilson
不必使用packages.config文件,你也可以尝试切换到PackageReference。这可能会有所帮助,但它是新的标准:https://learn.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference - Oguz Ozgul
1个回答

19
当我在Visual Studio解决方案资源管理器中查看此DLL引用的属性时,它显示引用自xxxxxx的版本4.2.0.1。首先,我认为您对DLL版本和nuget版本有一些误解。version 4.5.3只是nuget包System.Threading.Tasks.Extensions的版本号,而version 4.2.0.1只是System.Threading.Tasks.Extensions.dll(存在于nuget pacakge中)的编号。它们根本不是一个概念。您可以在xxx.csproj文件中看到此类dll引用。

enter image description here

一个nuget包的版本包含了多个针对不同项目框架的竞争性DLL,根据nuget机制,它们将被自动安装到相应的项目中。

DLL地狱 - 无法加载文件或程序集System.Threading.Tasks.Extensions

正如您所说,您在项目中使用了一个名为System.Reactive version 4.3.2的nuget包,该包依赖于System.Threading.Tasks.Extensions 4.5.3。您可以看到这一点:

enter image description here

从您的错误日志来看,该项目引用了System.Threading.Tasks.Extensions.dll 4.2.0.0,但在nuget包System.Threading.Tasks.Extensions 4.5.3中不存在,应为System.Threading.Tasks.Extensions.dll 4.2.0.1。不确定您是否更改了版本号或项目原因。
您可以执行以下步骤: 解决方法 1)确保packages.config文件中的System.Threading.Tasks.Extensions版本为4.5.32)确保您在xxx.csproj文件中将dll版本更改为4.2.0.1 3)在重新安装这些包之前,请清除nuget缓存,然后在工具 -> Nuget包管理器 -> 程序包管理器控制台下运行update-Package -reinstall以重新安装包。 4)创建一个新的框架4.7.2项目,然后引用这些Nuget包以测试是否由您的项目引起。

如果我可以点赞20次,我一定会这么做! - Daniel Lorenz
你有博客吗?我在哪里可以了解更多相关信息? - Kid

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