简单介绍一下,我已经看到了很多关于这个错误的问题,但在所有情况下,这些用户实际上都试图使用错误的容器托管asp.net核心应用程序。我的情况并非如此。
我有一个正在工作的.net核心控制台应用程序,托管在一个以netcoreapp2.1
为目标的docker容器中。我开始通过更改TargetFramework
标签和更新nuget包将其更新为netcoreapp3.1
。我还将基本docker镜像(.net核心运行时(从2.1更新到3.1。
当我尝试启动此图像时,我得到以下错误:
无法找到任何兼容的框架版本
找不到框架"Microsoft.AspNetCore.App"版本"3.1.0"。
找不到任何框架。
您可以通过安装指定的框架和/或SDK来解决此问题。
指定的框架可以在以下位置找到:
https://aka.ms/dotnet-core-applaunch?framework=Microsoft.AspNetCore.App&framework_ version=3.1.0&arch=x64&rid=ubuntu18.04-x64
错误消息是正确的,即没有安装框架,但它应该查找安装在容器中的Microsoft.NetCore.App
。它似乎受csproj文件中Project
元素中Sdk
属性的值控制,该文件在本项目中为<Project Sdk="Microsoft.NET.Sdk">
。
是什么导致运行时查找错误的框架依赖项?
问题是对Serilog.AspNetCore
的包引用。该包的netstandard 2.0
版本很好,但netcoreapp 3.1
版本采用了对Microsoft.AspNetCore.App
:的框架引用
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
<PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.1.1" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.1'">
<FrameworkReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.2" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="3.1.2" />
</ItemGroup>
这种依赖似乎在任何地方都看不到,这就是为什么很难找到它。拆除包裹,这似乎并不是真正需要的,解决了问题。