网站无法加载 Microsoft.EntityFrameworkCore

Website cannot load Microsoft.EntityFrameworkCore

我有一个 API-only 站点(无页面),它一启动就终止。

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

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,或者它是否应该与那个版本一起工作。

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

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

更新:

一些附加信息:

更新:

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

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

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

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

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

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


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

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

希望其中之一 suggestions/strategies 去某个地方。主要是从以前的 .NET 程序集不运行问题中得出一些潜在的预感。 (不过,请记住,自从我处理大型 C# 代码库以来已经一两年了)。

(i) 与 Nuget 回购源冲突的问题

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

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

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

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

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

Microsoft's docs here 中详细介绍了 Nuget 缓存的各种默认位置。如果 link 中断,这里是 tl;dr:

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

  • 解决方案文件夹中的项目包

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

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


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

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

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