网站无法加载 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,或者它是否应该与那个版本一起工作。
有谁知道这些版本差异是否重要,或者我还能尝试什么来解决这个问题?
该项目 运行 在我自己的计算机上运行良好。我最近升级了包管理器中所有建议的包。我认为它是因此而发生的。
更新:
一些附加信息:
- 从报错信息可以看出,我遇到问题的项目是TTRailtrax.
- TTRailtrax 依赖于 RailtraxCore,后者安装了 Microsoft.EntityFrameworkCore.dll .
- 我正在部署到本地文件夹,然后手动将这些文件复制到服务器。这一直有效到现在。
- 我认为唯一改变的是我更新了推荐的 NuGet 包。
- 该项目在我的本地计算机上继续 运行 正常。
- 我已确认我的本地计算机和服务器上存在相同版本的 Microsoft.EntityFrameworkCore.dll。
- 我已经清理了我的解决方案。
- 我卸载然后重新安装了 Microsoft.EntityFrameworkCore.dll 两次。
- 我在 IIS 上重启了几次应用程序。
- 我已多次重新部署到服务器。
- 我已将 Visual Studio 更新到最新版本。
更新:
经过进一步调查,我发现我的 bin\Release\net6.0 文件夹包含 Microsoft.EntityFrameworkCore.dll 和产品版本 6.0.1。但是在我的部署文件夹中,此文件的产品版本为 6.0.0。
这很可能与我遇到的问题有关。在什么情况下,我的部署文件夹中会放置一个与 bin 文件夹中不同的 DLL 版本?
我尝试从 bin 文件夹中复制文件,但这没有帮助。
以下步骤指南可帮助您解决问题:
- 从项目中删除所有
bin
和 obj
隐藏文件夹(对解决方案中的每个项目执行此操作)。
- 清洗溶液。
- 重建解决方案。
- 再次发布。
我们有两个文件夹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: %userprofile%\.nuget\packages
Mac/Linux: ~/.nuget/packages
(注意:可以被NUGET_PACKAGES
环境变量覆盖,或者globalPackagesFolder
project config property.
包下载缓存
Windows: %localappdata%\NuGet\v3-cache
Mac/Linux: ~/.local/share/NuGet/v3-cache
(注:可以被NUGET_HTTP_CACHE_PATH
环境变量覆盖)
解决方案文件夹中的项目包。
(iii)使用调试器的"Modules" window查看加载了哪些DLL,查看哪个DLL抛出异常
理想情况下,这可以查明哪个库或可执行文件是罪魁祸首。
- 尝试在所有异常情况下启用暂停(即 uncheck Just My Code and enable pausing on all unhandled exceptions。
- 在调试模式下,open the "Modules" window。暂停时,这应该允许您查看加载了哪些 DLL(包括它们的版本等),以及当前正在执行的 DLL(或抛出异常)。
- 最坏的情况,enable stepping into .NET source code。 (这令人惊讶地帮助了很多次非常奇怪的问题。)
希望这些提示之一可能有助于确定根本原因。
或者至少可能是罪魁祸首。
我 运行 完全在同一个问题中,因为我将 EntityFrameworkCore.Sqlite 从 6.0.0 更新到 6.0.1。
最后几天我或多或少做了上面提到的选项。
今天我找到了一个(希望如此)对我有用的最终解决方案:
在 Nuget 管理器中,仅 Microsoft.EntityFrameCore.Sqlite 列在已安装下,而不是 Microsoft.EntityFrameworkCore。所以依赖似乎包含在 Sqlite 包中。我添加了 Microsoft.EntityFrameworkCore。对我的 Web 应用程序进行显式打包,因为发布文件夹包含此版本的当前版本 6.0.1 和所有其他依赖项。
我有一个 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,或者它是否应该与那个版本一起工作。
有谁知道这些版本差异是否重要,或者我还能尝试什么来解决这个问题?
该项目 运行 在我自己的计算机上运行良好。我最近升级了包管理器中所有建议的包。我认为它是因此而发生的。
更新:
一些附加信息:
- 从报错信息可以看出,我遇到问题的项目是TTRailtrax.
- TTRailtrax 依赖于 RailtraxCore,后者安装了 Microsoft.EntityFrameworkCore.dll .
- 我正在部署到本地文件夹,然后手动将这些文件复制到服务器。这一直有效到现在。
- 我认为唯一改变的是我更新了推荐的 NuGet 包。
- 该项目在我的本地计算机上继续 运行 正常。
- 我已确认我的本地计算机和服务器上存在相同版本的 Microsoft.EntityFrameworkCore.dll。
- 我已经清理了我的解决方案。
- 我卸载然后重新安装了 Microsoft.EntityFrameworkCore.dll 两次。
- 我在 IIS 上重启了几次应用程序。
- 我已多次重新部署到服务器。
- 我已将 Visual Studio 更新到最新版本。
更新:
经过进一步调查,我发现我的 bin\Release\net6.0 文件夹包含 Microsoft.EntityFrameworkCore.dll 和产品版本 6.0.1。但是在我的部署文件夹中,此文件的产品版本为 6.0.0。
这很可能与我遇到的问题有关。在什么情况下,我的部署文件夹中会放置一个与 bin 文件夹中不同的 DLL 版本?
我尝试从 bin 文件夹中复制文件,但这没有帮助。
以下步骤指南可帮助您解决问题:
- 从项目中删除所有
bin
和obj
隐藏文件夹(对解决方案中的每个项目执行此操作)。 - 清洗溶液。
- 重建解决方案。
- 再次发布。
我们有两个文件夹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:%userprofile%\.nuget\packages
Mac/Linux:~/.nuget/packages
(注意:可以被NUGET_PACKAGES
环境变量覆盖,或者globalPackagesFolder
project config property.
包下载缓存 Windows:
%localappdata%\NuGet\v3-cache
Mac/Linux:~/.local/share/NuGet/v3-cache
(注:可以被NUGET_HTTP_CACHE_PATH
环境变量覆盖)解决方案文件夹中的项目包。
(iii)使用调试器的"Modules" window查看加载了哪些DLL,查看哪个DLL抛出异常
理想情况下,这可以查明哪个库或可执行文件是罪魁祸首。
- 尝试在所有异常情况下启用暂停(即 uncheck Just My Code and enable pausing on all unhandled exceptions。
- 在调试模式下,open the "Modules" window。暂停时,这应该允许您查看加载了哪些 DLL(包括它们的版本等),以及当前正在执行的 DLL(或抛出异常)。
- 最坏的情况,enable stepping into .NET source code。 (这令人惊讶地帮助了很多次非常奇怪的问题。)
希望这些提示之一可能有助于确定根本原因。 或者至少可能是罪魁祸首。
我 运行 完全在同一个问题中,因为我将 EntityFrameworkCore.Sqlite 从 6.0.0 更新到 6.0.1。 最后几天我或多或少做了上面提到的选项。 今天我找到了一个(希望如此)对我有用的最终解决方案:
在 Nuget 管理器中,仅 Microsoft.EntityFrameCore.Sqlite 列在已安装下,而不是 Microsoft.EntityFrameworkCore。所以依赖似乎包含在 Sqlite 包中。我添加了 Microsoft.EntityFrameworkCore。对我的 Web 应用程序进行显式打包,因为发布文件夹包含此版本的当前版本 6.0.1 和所有其他依赖项。