【问题标题】:DLL hell - Could not load file or assembly System.Threading.Tasks.ExtensionsDLL 地狱 - 无法加载文件或程序集 System.Threading.Tasks.Extensions
【发布时间】:2020-06-25 00:16:43
【问题描述】:

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

<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.3 版本中引用了System.Threading.Tasks.Extensions(我无法更改此版本,因为其他包都依赖它)。

当我在 Visual Studio 解决方案资源管理器中转到此 DLL 引用的属性时,它显示从 .....\packages\System.Threading.Tasks.Extensions.4.5.3\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll 引用的版本 4.2.0.1

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。任何帮助将不胜感激。

【问题讨论】:

  • 发现故障根本原因的最佳方法是启用融合日志。我认为“或其依赖项之一”是这里的关键短语,您可以通过检查融合日志来查看实际丢失的文件:docs.microsoft.com/en-us/dotnet/framework/tools/…
  • 我试图安装这个包,System.Runtime.CompilerServices.Unsafe的默认版本是4.5.2而不是4.7.0!!
  • 在查看 4.5.2 版本的程序集时,我看到了一个有趣的程序集参考:.assembly extern System.Runtime.CompilerServices.Unsafe
  • packages.config 中的版本号是 NuGet 包版本,并且不(必然)与其中的 DLL 的程序集版本相关联。您是否尝试过完全删除 &lt;dependentAssembly&gt; 节点?
  • 除了使用 packages.config 文件,您还可以尝试切换到 PackageReference,这可能有帮助,也可能没有帮助,但这是新标准:docs.microsoft.com/en-us/nuget/consume-packages/…

标签: c# visual-studio nuget visual-studio-2019


【解决方案1】:

当我在 Visual Studio 中转到此 DLL 引用的属性时 解决方案资源管理器,显示从 xxxxxx 引用的 4.2.0.1 版本

首先,我认为您对DLL versionthe nuget version 有一点误解。

version 4.5.3 只是 nuget 包 System.Threading.Tasks.Extensions 的版本 编号而version 4.2.0.1 只是System.Threading.Tasks.Extensions.dll(存在于nuget pacakge)编号。它们根本不是一个概念。你可以看到xxx.csproj文件中引用了这样的dll。

一个版本的nuget包包含多个针对不同项目框架的竞争DLLS,会根据nuget机制自动安装到对应的项目中。

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

如您所说,您有一个名为 System.Reactive version 4.3.2 的 nuget 包,它依赖于您的项目中的 System.Threading.Tasks.Extensions 4.5.3。你可以看到这个:

从您的错误日志中,似乎该项目引用了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)确保System.Threading.Tasks.Extensions 版本在packages.config 文件中为4.5.3

2)确保将xxx.csproj文件中的dll版本更改为4.2.0.1

3)在重新安装这些包之前,请先clean the nuget cache,然后在Tools下运行update-Package -reinstall-->Nuget Package Manager->Package Manager Console重新安装包

4)新建一个framework 4.7.2项目,然后引用这些nuget包来测试是否是你的项目引起的。

【讨论】:

  • 如果我可以投票 20 次,我会的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多