Asp.Net 核心 3.1 应用程序设置了错误的运行时选项



我正在开发一个快速 ASP.Net Core 3.1应用程序,并尝试将其推送到Azure中免费的Linux托管WebApp。 该应用程序在本地构建、运行,并部署到 Windows Azure 中的 docker 环境。所有文件都按预期部署。

挑战在于:

使用命令启动应用程序时

dotnet <mywebproject>.dll

日志告诉我:

找不到框架"Microsoft.WindowsDesktop.App",版本"3.1.0"。

首先要检查的是查看是否缺少运行时

root@4182491:~/site/wwwroot# dotnet --list-runtimes
Microsoft.AspNetCore.App 3.1.0 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 3.1.0 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

经过一番摸索,我看到有一个名为.runtimeconfig.json的文件:

{
"runtimeOptions": {
"tfm": "netcoreapp3.1",
"frameworks": [
{
"name": "Microsoft.WindowsDesktop.App",
"version": "3.1.0"
},
{
"name": "Microsoft.AspNetCore.App",
"version": "3.1.0"
}
],
"configProperties": {
"System.GC.Server": true
}
}
}

所以我需要的运行时就在那里,但 dotnet 不想选择它!

从错误中,我假设dotnet 正在尝试使用它可以看到的第一个框架启动网站,但是如何在构建过程中摆脱它?我已经查找了这些文件在构建过程中是如何生成的,并且看不到阻止框架放入 runtimeOptions文件中的选项。

由于我使用的是使用 Azure DevOps 构建应用,因此我无法简单地手动编辑文件并将其上传到运行该文件的托管 Linux 容器。

所以我需要以下任一方面的帮助:

  • 如何构建项目并从正在生成的框架列表中排除"Microsoft.WindowsDesktop.App">
  • 如何使用特定的目标框架 NAME 在 linux 容器中启动应用程序(我只能从我在dotnet exec中看到的设置 in 中使用 SSL 到容器中选择版本。

这或多或少让我发疯!

我将自己回答这个问题,因为我在喝了太多咖啡后找到了解决方案:

事实证明,您在此处看到的选项

{
"runtimeOptions": {
"tfm": "netcoreapp3.1",
"frameworks": [
{
"name": "Microsoft.WindowsDesktop.App",
"version": "3.1.0"
},
{
"name": "Microsoft.AspNetCore.App",
"version": "3.1.0"
}
],
"configProperties": {
"System.GC.Server": true
}
}
}

根本不是选项,而是要求。我发现了对为 WPF 设计的包的依赖关系,该包当然需要安装Microsoft.WindowsDesktop.App运行时。由于我是在Windows计算机上开发,因此代码具有在调试中运行所需的所有运行时,而不是在linux上运行。

我现在将关闭它,但由于命名导致了混乱,我将保留这个问题,以防其他人遇到与我相同的困惑。

相关内容

最新更新