【问题标题】:Website cannot load Microsoft.EntityFrameworkCore网站无法加载 Microsoft.EntityFrameworkCore
【发布时间】:2022-01-20 00:55:38
【问题描述】:

我有一个仅使用 API 的网站(无页面),一旦启动就会终止。

我在事件查看器中发现以下错误。

Application: w3wp.exe
CoreCLR Version: 6.0.21.52210
.NET Version: 6.0.0
Description: The process was terminated due to an unhandled exception.
Exception Info: System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.EntityFrameworkCore, Version=6.0.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. The system cannot find the file specified.
File name: 'Microsoft.EntityFrameworkCore, Version=6.0.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'
   at Program.<Main>$(String[] args)

还有……

Application '/LM/W3SVC/18/ROOT' with physical root 'C:\inetpub\wwwroot\tt.railtrax.com\' hit unexpected managed exception, exception code = '0xe0434352'. First 30KB characters of captured stdout and stderr logs:
Unhandled exception. System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.EntityFrameworkCore, Version=6.0.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. The system cannot find the file specified.
File name: 'Microsoft.EntityFrameworkCore, Version=6.0.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'
   at Program.<Main>$(String[] args)

当我查看部署文件夹中的 Microsoft.EntityFrameworkCore.dll 时,它似乎是 6.0.21 版。

包管理器说我安装了 6.0.1。所以我不知道为什么我有 6.0.21,或者它是否应该适用于该版本。

有谁知道这些版本差异是否重要,或者我还能尝试解决什么问题?

该项目在我自己的计算机上运行良好。我最近升级了包管理器中的所有建议包。我认为它是因此而发生的。

更新:

一些附加信息:

  • 从错误消息中可以看出,我遇到问题的项目是 TTRailtrax
  • TTRailtrax 依赖于 RailtraxCore,它安装了 Microsoft.EntityFrameworkCore.dll
  • 我正在部署到本地文件夹,然后手动将这些文件复制到服务器。这一直有效。
  • 我认为唯一改变的是我更新了推荐的 NuGet 包。
  • 该项目在我的本地计算机上继续正常运行。
  • 我已确认我的本地计算机和服务器上存在相同版本的 Microsoft.EntityFrameworkCore.dll
  • 我已经清理了我的解决方案。
  • 我现在卸载并重新安装了两次 Microsoft.EntityFrameworkCore.dll
  • 我在 IIS 上重新启动了应用程序几次。
  • 我已经多次重新部署到服务器。
  • 我已将 Visual Studio 更新到最新版本。

更新:

经过进一步调查,我发现我的 bin\Release\net6.0 文件夹包含产品版本为 6.0.1 的 Microsoft.EntityFrameworkCore.dll。但是在我的部署文件夹中,该文件的产品版本为 6.0.0。

这似乎很可能与我看到的问题有关。在什么情况下,部署文件夹中的 DLL 版本会与 bin 文件夹中的不同?

我尝试从 bin 文件夹中复制文件,但没有帮助。

【问题讨论】:

  • 您是如何在其中实际发布和运行的?
  • @DanielA.White:我发布到一个文件夹,然后将这些文件复制到我的服务器。这在过去一直有效。
  • 使用框架是一步,但使用 .net 核心,我认为您必须将其发布为独立的
  • 您的站点是否具有也使用 efcore 的依赖项?所有依赖项是否都是最新的版本? (nuget 包管理器合并选项卡)。在发布时合并不匹配的版本之前,我已经拥有它,并且引用旧包的后期构建项目覆盖了早期构建的后期包(2个项目,projectA使用libraryX v1,projectB使用libraryX v2,project B 先构建,然后 A 构建并用 A 使用的旧 libX 覆盖 B 拥有的较新 libX)
  • 从您的项目中删除所有binobj 隐藏文件夹>> 清理解决方案>> 重建解决方案表单构建菜单。再次发布。这可能会解决您的问题

标签: c# asp.net-core .net-core entity-framework-core .net-6.0


【解决方案1】:

以下步骤指南可帮助您解决问题:

  1. 从您的项目中删除所有 binobj 隐藏文件夹(对解决方案中的每个项目执行此操作)。
  2. 清洁溶液。
  3. 重建解决方案。
  4. 再次发布。

我们有两个文件夹binobj,因为编译过程要经过编译和链接两个步骤。见下图。


⬤ 在编译阶段,每个代码文件都被编译成单独的编译单元。所以如果你有两个代码文件,就会生成两个独立的编译代码。
⬤ 在链接阶段,所有这些编译的代码文件被链接并编译成一个单独的单元程序集,可以是 DLL 或 EXE。 参考:Link

【讨论】:

  • 老实说,我认为 60k 代表,c# 金徽章持有人可能知道 bin 文件夹是什么..
  • 此答案的某些文本似乎是从 Cody Gray 的答案 here 复制的,没有注明出处。答案的其他元素似乎来自 Shivprasad Koirala 的相同答案。这种策略通常不会很好。我们就像一个团队,我们承认我们的专业同事的努力,而不是把他们的工作当作我们自己的工作
  • @CaiusJard 这个答案可能会被其他开发人员搜索,这就是我添加此信息的原因...
  • 然后建议将此问题作为该问题的副本,而不是在此处复制其答案并将“归属”隐藏在底部的一个小链接中,仅在被调用时才隐藏
  • 虽然没有必要向我描述 objbin 文件夹的用途,但我已经解决了这个问题。我这样做的方式是从我的解决方案中的所有项目中删除这些文件夹。一旦解决,就无法删除悬赏问题。而这确实是正确的答案。
【解决方案2】:

这开始是一条超出字符限制的评论...

希望这些建议/策略中的一个能够有所作为。这里主要是由于以前的 .NET 程序集不运行的问题而产生的一些潜在预感。 (不过,请记住,我从事大型 C# 代码库工作已经有一两年了)。

(i) Nuget repo 源冲突问题

这通常是在您拥有公司特定的 Nuget 存储库的情况下。如果公共 Nuget 存储库(或者在某些情况下甚至允许)与公司的存储库之间存在冲突的包、版本等,我已经看到会发生问题。

(ii) 请求依赖版本冲突的 Nuget 包问题

我非常清楚地记得有一次我必须手动检查我的每个 Solution-Wide 依赖项是否在同一版本上。我从不相信每个包的视图,因为安装更新但错误和冲突的包非常容易。换句话说,确保 EF Core 引用的任何包或将引入 EF Core 的任何其他包在项目之间的版本相同。

(iii) 您的本地 Nuget 包缓存可能已损坏或不一致

这不是我第一次不得不删除 Nuget 缓存并重新下载包。 重要提示:如果我没记错的话,这可能需要重新安装或修复安装 .NET Core。

Nuget 缓存的各种默认位置在Microsoft's docs here 中有详细说明。如果链接中断,这里是 tl;dr:

  • 包下载缓存 窗口:%localappdata%\NuGet\v3-cache
    Mac/Linux:~/.local/share/NuGet/v3-cache
    (注:可以被NUGET_HTTP_CACHE_PATH环境变量覆盖)

  • 项目包在解决方案文件夹本身中。

(iii) 使用调试器的"Modules" window 查看加载了哪些 DLL,并查看哪个 DLL 引发了异常

理想情况下,这可以查明哪个库或可执行文件是罪魁祸首。


希望这些提示之一可能有助于确定根本原因是什么。 或者至少可能是罪魁祸首。

【讨论】:

    【解决方案3】:

    我遇到了完全相同的问题,因为我将 EntityFrameworkCore.Sqlite 从 6.0.0 更新到 6.0.1。 最后几天我或多或少地做了上面提到的选项。 今天我找到了一个(希望是)对我有用的最终解决方案:

    在 Nuget 管理器中,仅 Microsoft.EntityFrameCore.Sqlite 列在 Installed 下,而不是 Microsoft.EntityFrameworkCore。所以依赖似乎包含在 Sqlite 包中。我添加了 Microsoft.EntityFrameworkCore。对我的 Web 应用程序显式的包,因为发布文件夹包含当前版本 6.0.1 和所有其他依赖项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 2017-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多