【问题标题】:How to resolve DLL Hell introduced since upgrading to EF Core 2.0?如何解决升级到 EF Core 2.0 后引入的 DLL Hell?
【发布时间】:2017-11-20 00:53:17
【问题描述】:

我们的项目(.Net Framework 4.6.2)在 EF Core 1.1.0 上运行良好。然后我们决定升级到 EF Core 2.0.0。花了几天时间调整代码以使用新语法,让我们的单元和集成测试再次通过,最后他们做到了。所以今天我们部署到我们的 QA 站点上,它立即中断了 DLL Hell 消息:

无法加载文件或程序集 'System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)

在升级过程中,我已将 System.Net.Http 从 4.3.0 更新到 4.3.3,因此我尝试将其反转。没有帮助。我尝试注释掉 web.config 中的依赖程序集引用,这使得消息发生了变化:

无法加载文件或程序集 'System.Net.Http, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)

你好!如果我理解正确,这意味着绑定重定向实际上找到了 System.Net.Http 的 4.1.1.0 版本(这是正确的版本) - 但是还有一些其他程序集与我的部署一起出现,即寻找版本 4.0.0.0,并忽略绑定重定向。

我如何找到哪个程序集搞砸了我?以及如何让它尊重绑定重定向?

【问题讨论】:

  • 我不知道这是否是您的问题,但在 assemblyBinding 标签上有一个“appliesTo”属性。如果将其设置为错误的版本,则重定向将失败。当它开始导致此类问题时,我们刚刚删除了该属性。 docs.microsoft.com/en-us/dotnet/framework/configure-apps/…
  • @asawyer 我在web.config 中没有看到任何“appliesTo”标签。
  • 对不起。祝你好运。
  • 当我将我的一个 .NET Core 应用程序升级到 2.0 时,我在将新版本发布到 Azure 时遇到了 DLL 地狱。这是因为以前版本的依赖 DLL 在发布时没有被清除。如果可能,请暂停 QA,关闭应用程序,清除发布目录的内容(除了任何配置或资源)并重新发布应用程序。我在这里写了我的烦恼:dotnetcore.gaprogman.com/2017/11/02/…

标签: asp.net-mvc dll entity-framework-core


【解决方案1】:

显然,我不是唯一一个被这个问题坑死的人。请参阅hereherehere

TLDR: Visual Studio 2017 包含一堆最新最好的 DLL,它们非常好,如果您使用 .NET Framework 4.6,MSBuild 会将它们强加给您.2 或更早版本,因为您为什么要使用您在绑定重定向中指定的那些 cobwebby 旧版本?

我尝试了两种可行的解决方案:

  1. 又快又脏:进入您的Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461 文件夹。你会在那里找到libref 文件夹。进入其中的每一个并创建一个名为HideMe 或类似名称的子文件夹。然后将 all DLL except netstandard.dll 移动到 HideMe 文件夹中。现在,MSBuild 无法强加自己的想法来决定哪个 DLL 最适合您。
  2. 正确方法:升级到.NET Framework 4.7.1。这将更加劳动密集,并且可能会破坏一些东西,但至少您不必像我的第一个解决方法那样进行黑客攻击。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 2022-09-30
    • 2019-03-13
    相关资源
    最近更新 更多