使用哪个运行时版本由您的项目文件定义,因此不同的运行时可以在同一台机器上运行而不会出现任何问题。
假设您有两个服务:Service1 是使用 .net core 2.1 构建的,Service2 是使用 .net core 3.1 构建的。
项目文件将如下所示:
Service1.csproj
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
Service2.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 运行时 2.1.14
2) Asp.Net Core 运行时 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}.
");
});
}
}
我在 release 中发布了这两个服务:
服务1:
C:\Users\info\source\repos\Service1> dotnet publish -c Release
适用于 .NET Core 的 Microsoft (R) Build Engine 版本 16.4.0+e901037fe
版权所有 (C) 微软公司。保留所有权利。
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 core framework 并在同一 IIS 上运行特定版本的 Web 应用程序是没有问题的。