执行EF Core迁移包时抛出.NET框架未找到错误的原因排查
我为.NET应用执行以下命令创建了EF Core迁移包,用于部署到目标机器时运行数据库迁移:
dotnet ef migrations bundle --context applicationdbcontext -o c:\users\hp\downloads\bundle1.exe --force
但在目标机器运行bundle1.exe时,出现如下错误提示:
You must install or update .NET to run this application.
App: C:\Users\Amjad\Downloads\AppName\bundle1.exe
Architecture: x64
Framework: 'Microsoft.NETCore.App', version '9.0.0' (x64)
.NET location: C:\Users\Amjad\Downloads\AppName\No frameworks were found.
目标机器执行dotnet --info的输出显示已安装.NET 9.0.0及更高版本运行时,具体输出如下:
C:\Users\hp>dotnet --info .NET SDK: Version: 9.0.102 Commit: cb83cd4923 Workload version: 9.0.100-manifests.43af17c7 MSBuild version: 17.12.18+ed8c6aec5 Runtime Environment: OS Name: Windows OS Version: 10.0.19045 OS Platform: Windows RID: win-x64 Base Path: C:\Program Files\dotnet\sdk\9.0.102\ .NET workloads installed: There are no installed workloads to display. Configured to use loose manifests when installing new manifests. Host: Version: 9.0.1 Architecture: x64 Commit: c8acea2262 .NET SDKs installed: 8.0.204 [C:\Program Files\dotnet\sdk] 9.0.102 [C:\Program Files\dotnet\sdk] .NET runtimes installed: Microsoft.AspNetCore.App 6.0.13 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 8.0.4 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 9.0.0 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 9.0.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.NETCore.App 6.0.13 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 8.0.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 9.0.0 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 9.0.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.WindowsDesktop.App 6.0.13 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] Microsoft.WindowsDesktop.App 8.0.4 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] Microsoft.WindowsDesktop.App 9.0.0 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] Microsoft.WindowsDesktop.App 9.0.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] Other architectures found: x86 [C:\Program Files (x86)\dotnet] registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation] Environment variables: Not set global.json file: Not found Learn more: https://aka.ms/dotnet/info Download .NET: https://aka.ms/dotnet/download
请问为何bundle1.exe仍无法执行,并提示需要安装对应框架?
迁移包的.NET路径检测异常:错误信息显示
.NET location: C:\Users\Amjad\Downloads\AppName\,说明bundle1.exe在当前目录下查找.NET运行时,而非系统默认的C:\Program Files\dotnet\路径。这是因为默认创建的迁移包属于依赖框架部署,但打包时的环境或配置导致它优先检测本地目录的.NET文件。版本匹配的严格性问题:尽管目标机器安装了.NET 9.0.0和9.0.1,但迁移包明确要求
Microsoft.NETCore.App, version '9.0.0',部分场景下高版本运行时不会自动兼容低版本的严格依赖,需要确认版本匹配策略。解决办法:
- 重新创建迁移包时,添加
--self-contained参数打包成自包含应用,将所需.NET运行时一并打包,无需依赖目标机器的系统安装:dotnet ef migrations bundle --context applicationdbcontext -o c:\users\hp\downloads\bundle1.exe --force --self-contained -r win-x64 - 检查目标机器的环境变量,确保
DOTNET_ROOT指向C:\Program Files\dotnet\,未设置则手动添加,让应用能定位到系统安装的.NET运行时。 - 在目标机器上进入bundle1.exe所在目录,执行
dotnet bundle1.exe,直接通过系统的dotnet宿主程序运行迁移包,绕过应用自身的路径检测逻辑。
- 重新创建迁移包时,添加
内容的提问来源于stack exchange,提问作者user3656651

