如何在 .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)可以通过旧的 TargetFramework
s(netcoreapp2.1
、netcoreapp3.1
等)针对旧的运行时。
较旧的 SDK 无法通过新的 TargetFramework
s 定位较新的运行时。
【讨论】:
以上是关于如何在 .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