如何在 .NET Core 3.0 SDK 上构建多目标 .NET 5 和 .NET Core 3.1

Posted

技术标签:

【中文标题】如何在 .NET Core 3.0 SDK 上构建多目标 .NET 5 和 .NET Core 3.1【英文标题】:How to multitarget .NET 5 and .NET Core 3.1 while still building on .NET Core 3.0 SDK 【发布时间】:2021-05-15 11:26:46 【问题描述】:

我正在尝试升级我的项目以支持 .NET 5,同时仍在 .NET Core 3.1 工具集上构建。

我尝试像这样将 .NET 5 TFM (.net5.0) 添加到我的目标框架中。

<TargetFrameworks>netcoreapp3.0;netcoreapp3.1;net5.0</TargetFrameworks>

很遗憾,这会导致在仅安装了 .NET Core 3.1 工具集的机器上运行时构建失败。

error MSB3971: The reference assemblies for ".NETFramework,Version=v5.0" were not found. You might be using an older .NET SDK to target .NET 5.0 or higher. Update Visual Studio and/or your .NET SDK.

我正在尝试找到一个条件,以便仅在可用时才能定位net5.0,但文档很少。

【问题讨论】:

我认为 MSBuild 没有给你一个合适的条件来定义。但在您的构建脚本中,您可以检测可用的实际 SDK 版本并即时修改项目文件(删除 .NET 5 目标) 您在这里的确切目标是什么?你到底想做什么?为什么您希望一个项目可以由多个 SDK 版本构建?为什么不将其保留在(例如)netcoreapp3.1?另外,假设您可以使用 3.1 SDK 构建。你的预期结果是什么?您是否也希望能够在那里运行net5.0 应用程序? 我的项目多目标 .netstandard2.0.netcoreapp3.1.net5.0,并定义了特定于 SDK 的代码。出于兼容性原因,它应该仍然可以针对旧版 SDK 构建,但代码的 .net5.0 部分已定义。 如果您的系统上没有 .net 5,您将如何期望 VS 构建一个可供其他 .net 5 系统使用/使用的程序集。多目标是指您的代码生成的工件,而不是用于构建它的工具。打个比方,如果您是一名摄影师,那么多目标就是为您的客户提供一卷胶卷和一个 USB 数码产品。如果您只有胶片相机,您将无法制作 USB 数码产品。您的构建环境需要 .net5 才能制作以 .net5 为目标的工件。 【参考方案1】:

这是不可能的。

新的 SDK(例如 5.0)可以通过旧的 TargetFrameworks(netcoreapp2.1netcoreapp3.1 等)针对旧的运行时。

较旧的 SDK 无法通过新的 TargetFrameworks 定位较新的运行时。

【讨论】:

以上是关于如何在 .NET Core 3.0 SDK 上构建多目标 .NET 5 和 .NET Core 3.1的主要内容,如果未能解决你的问题,请参考以下文章

将 Visual Studio 2017 与 .Net Core SDK 3.0 一起使用

无法使用 VS Code 在 Windows 机器上为 linux 构建 .Net core 3.0 项目

使用 Blazor Asp.NetCore 托管模板时获取“NETSDK1045 当前的 .NET SDK 不支持 .NET Core 3.0 作为目标”

Docker 构建失败,当前 .NET SDK 不支持面向 .NET Core 2.1

将 webpack 构建与 ASP.NET Core 3.0 集成的最佳方式?

Publish.net core 3.0 as FDE for win on linux