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

时间:2018-07-30 11:40:35

标签: c# .net nuget azure-devops azure-artifacts

我们有一个当前针对.NET 4.6.2的类库,该类库具有一些依赖项(SDK类),这些依赖项通过nuget进行了解析。

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

我们正在使用VSTS来构建库并将其打包/推入私有的NuGet feed。

现在,我们需要将类库同时定位到.NET 4.5.2.NET 4.6.2,因为我们有一个项目使用此库来定位.NET 4.5.2,不幸的是,没有升级它的目标是没有选择

所以最重要的问题是:是否有办法为两个multipe目标框架构建解决方案?

到目前为止我尝试过的事情:

  • 进行了很多研究,但是这个问题似乎并不普遍(或者在这种情况下我只是无法正确地使用Google搜索)
  • 对构建变量进行了实验,但这似乎也无法解决

我还考虑了用于解析和处理所有packages.config*.csproj文件的某种脚本,但是我认为这根本不是最佳实践。

2 个答案:

答案 0 :(得分:1)

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

实际上非常简单:您必须按照以下步骤手动编辑*.csproj文件:

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

如果在Visual Studio中打开此类项目的属性页,则会看到目标平台的字段为只读,因此尚无直接支持。作为构建过程的结果,您将获得指定构建输出路径的多个子文件夹,这些子文件夹在单独的目录中包含所有指定目标平台的程序集。

答案 1 :(得分:1)

拥有一个程序集/类库很容易,该库可以供面向不同版本.NET Framework的项目使用。

如果您有针对4.5.2和4.6.2的项目,但您想提供一个公共库,则将库目标设为4.5.2。 .Net make本质上是向后兼容的,因此您始终可以使用比使用库/项目目标版本低的库。 从技术上讲,您也可以定位低于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