使用哪个运行时版本由您的项目文件定义,因此不同的运行时可以在同一台机器上运行而不会出现任何问题。假设您有两个服务:Service1 是使用 .net core 2.1 构建的,Service2 是使用 .net core 3.1 构建的。项目文件将如下所示:
服务1.csproj
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
服务2.csproj
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
dotnet run
通过或运行应用程序dotnet ServiceX.dll
后,dotnet
可执行文件就是应用程序的宿主,并根据程序集元数据选择正确的运行时。要使用的运行时实际上是在已编译的 DLL 中编写的。
因此,只要安装了所需的运行时,2.* 和 3.* 应用程序可以完全共存于同一台机器上。
在此处阅读更多信息:https ://docs.microsoft.com/en-us/dotnet/core/versions/selection
看看这个实验。在我的机器上安装了以下内容:1)Asp.Net Core Runtime 2.1.14 2)Asp.Net Core Runtime 3.1.2 3)IIS 10.0 4)Asp.Net Core Module(与托管捆绑包一起安装)
我创建了 2 个应用程序,每个运行时一个:
dotnet new web -f netcoreapp2.1 -o Service1
和
dotnet new web -f netcoreapp3.1 -o Service2
然后我像这样修改了两个应用程序 Startup.cs:
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.Run(async context =>
{
var framework = Assembly
.GetEntryAssembly()?
.GetCustomAttribute<TargetFrameworkAttribute>()?
.FrameworkName;
var taskLocation = typeof(Task).Assembly.Location;
await context.Response.WriteAsync($@"Hello World from {framework}
Location of Task assembly: {taskLocation}.
");
});
}
}
我在版本中发布了这两个服务:Service1: C:\Users\info\source\repos\Service1> dotnet publish -c Release Microsoft (R) Build Engine version 16.4.0+e901037fe for .NET Core 版权所有 (C) Microsoft Corporation。版权所有。
Restore completed in 159,32 ms for C:\Users\info\source\repos\Service1\Service1.csproj.
Service1 -> C:\Users\info\source\repos\Service1\bin\Release\netcoreapp2.1\Service1.dll
Service1 -> C:\Users\info\source\repos\Service1\bin\Release\netcoreapp2.1\publish\
服务2:
C:\Users\info\source\repos\Service2> dotnet publish -c Release
Microsoft (R) Build Engine version 16.4.0+e901037fe for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.
Restore completed in 41,98 ms for C:\Users\info\source\repos\Service2\Service2.csproj.
Service2 -> C:\Users\info\source\repos\Service2\bin\Release\netcoreapp3.1\Service2.dll
Service2 -> C:\Users\info\source\repos\Service2\bin\Release\netcoreapp3.1\publish\
在 IIS 下我创建了两个网站,每个服务一个,每个都指向正确的输出目录
service1.lvh.me >>> C:\Users\info\source\repos\Service1\bin\Release\netcoreapp2.1\publish\
service2.lvh.me >>> C:\Users\info\source\repos\Service2\bin\Release\netcoreapp3.1\publish\
然后我访问了每个网站。访问 service1.lvh.me 我得到了:
访问 service2.lvh.me 我得到了:

如您所见,每个应用程序都需要正确版本的框架,并且框架类型是从特定文件夹加载的。
因此,在同一台机器上运行不同版本的 .net 核心框架并在同一 IIS 上运行特定版本的 Web 应用程序是没有问题的。