如何为多个目标框架构建解决方案?

How to build a solution for mutliple target frameworks?

我们有一个目前针对 .NET 4.6.2 的 class 库,它具有一些通过 nuget 解析的依赖项 (SDK classes)。

该 class 库所需的所有 SDK 程序集都可用于多个目标平台(例如 4.6.24.5.2 等)。

我们正在使用 VSTS 构建库并将其 pack/push 到私有 NuGet 提要。

现在,我们需要我们的 Class-Library 同时针对 .NET 4.5.2.NET 4.6.2,因为我们有一个项目使用这个针对 .NET 4.5.2 的库(不,不幸的是升级它的目标是没有选择的)

所以真正的问题是:有没有办法为两个多目标框架构建解决方案?

到目前为止我尝试了什么:

我还考虑过使用某种脚本来解析和操作所有 packages.config*.csproj 文件,但我想这根本不是最佳做法。

实际上,是的,这似乎是可能的,但我从未见过任何相关文档,我自己也没有尝试过。我只是无意中发现了一个使用它的开源项目,并突然意识到这是可能的。

其实很简单:您必须手动编辑 *.csproj 文件,如下所示:

  1. 将项目转换为新的 sdk 样式格式,就像将其移植到 .NET Standard 一样(文档根目录应为 <Project Sdk="Microsoft.NET.Sdk">
  2. 而不是<TargetFramework>net452</Targetframework>,只需写<TargetFrameworks>net452;net462</TargetFrameworks>

如果您在 Visual Studio 中打开此类项目的属性页面,您会看到目标平台的字段是只读的,因此(目前)还没有直接支持它。作为生成过程的结果,您将获得指定生成输出路径的多个子文件夹,其中包含单独目录中所有指定目标平台的程序集。

拥有可供针对不同版本 .Net Framework 的项目使用的 assembly/class 库非常容易。

如果您有针对 4.5.2 和 4.6.2 的项目,但您想要提供一个公共库,那么让您的库针对 4.5.2。 .Net make 本质上是向后兼容的,因此您始终可以使用针对低于使用 library/project 目标版本的库。 从技术上讲,您也可以定位低于该值的任何内容,包括 3.5,但为什么要这么做。

这也适用于 .Net Core 和 .Net Standard,但这些组合很快就会叠加起来。如果库以 .Net Standard 1.0 为目标,那么它可以被以任何版本的 .Net Standard >= 1.0、任何版本的 .Net Core >= 1.0 和任何版本的 .Net Framework >= 4.5.2 为目标的项目使用。查看docs on .Net Standard了解详情。

有关 .Net Standard 的更多详细信息,请查看 this blog post from Daniel Crabtree