【问题标题】:How to build a solution for mutliple target frameworks?如何为多个目标框架构建解决方案?
【发布时间】:2018-07-30 11:40:35
【问题描述】:

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

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

我们使用 VSTS 来构建库并将其打包/推送到私有 NuGet 源。

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

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

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

  • 进行了很多研究,但这个问题似乎并不普遍(或者在这种特殊情况下我无法正确使用谷歌搜索)
  • 尝试了构建变量,但这似乎也没有解决问题

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

【问题讨论】:

  • 如果类库以 .Net Framework 4.5.2 为目标,那么它既可以被目标 4.5.2 的代码使用,也可以被以后的任何东西(包括 4.6.2)使用,只针对你可以获得的最早版本远离。
  • @phuzi 奇怪的是,这似乎是不可能的,因为开发该库的系统在某些版本中至少需要 4.6.2,而在其他版本中至少需要 4.5.2。
  • 认为您错过了重点。我可以编写一个面向 .Net Framework 4.7.2 的应用程序并使用一个面向 .Net Framework 4.0 的库。只要您的类库面向 4.5.2,您的应用就可以面向 4.5.2 或更高版本
  • 啊,好的,我试试看,完成后再回来。
  • @phuzi 我采用了你的方法,它对我有用。有点尴尬,我自己无法弄清楚这一点,但是嘿,这就是这个社区的用途吗?如果您提供您的评论作为答案,我很乐意接受,因为这解决了我的问题。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 太好了,你知道关于 nuget-dependecies 的任何事情吗?
    • @nozzleman 好吧,我猜是 msbuild 将分别恢复每个目标平台的 nuget 依赖项。另外,你可以指定依赖于目标平台的条件,所以我没有看到概念问题,但在你钉我之前,我真的没有尝试过,还没有
    猜你喜欢
    • 2012-11-09
    • 2011-05-30
    • 2019-09-27
    • 1970-01-01
    • 2019-04-07
    • 2015-07-27
    • 1970-01-01
    • 2011-06-07
    • 2011-08-18
    相关资源
    最近更新 更多