【问题标题】:TargetFramework vs. TargetFrameworks (plural)TargetFramework 与 TargetFrameworks(复数)
【发布时间】:2020-02-21 17:20:21
【问题描述】:

在我的.NET Core项目的.csproj文件中,默认有这3行:

<PropertyGroup>
  <TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>

现在,如果我想针对多个框架,我可以将其更改为:

<PropertyGroup>
  <TargetFrameworks>netcoreapp2.2;net4.6</TargetFrameworks>
</PropertyGroup>

差异是微妙的,但它就在那里。针对多个框架时,您必须使用&lt;TargetFrameworks&gt;(复数)而不是&lt;TargetFramework&gt;(单数)。

但是为什么会这样呢?似乎只选择两者之一会更容易,然后总是使用它。这让我想到,选择不同(尽管相似)的词可能有更复杂的原因,这取决于您是否针对更多框架。有人能就这个话题给我启发吗?

【问题讨论】:

  • 只是他们帮助现有项目的程序员(几乎所有人)迁移到 .NETCore。他们将继续部署到 .NETFramework 一段时间,但可以肯定的是,当他们最终采用 .NETCore 时不会有什么意外。这最终会消失。
  • 请注意,还有其他类似的属性。平台,我认为至少还有配置。不过它们可能更灵活一些(可以将 2 用于单数或 1 用于复数;不是 100% 确定)。

标签: c# .net-core target-framework


【解决方案1】:

基本上,当您想要定位单个框架时,您使用&lt;TargetFramework&gt; 标签(在您构建针对.net-core 的应用程序的情况下),但您也可以通过使用有条件地引用多个框架的程序集&lt;TargetFrameworks&gt;(如果您正在为 .net 标准和 .net-core 构建应用程序),然后您可以使用带有 if-then-else 逻辑的预处理器符号有条件地针对这些程序集进行编译

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>netstandard1.4;net40;net45</TargetFrameworks>
  </PropertyGroup>

  <!-- Conditionally obtain references for the .NET Framework 4.0 target -->
  <ItemGroup Condition=" '$(TargetFramework)' == 'net40' ">
    <Reference Include="System.Net" />
  </ItemGroup>

  <!-- Conditionally obtain references for the .NET Framework 4.5 target -->
  <ItemGroup Condition=" '$(TargetFramework)' == 'net45' ">
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Threading.Tasks" />
  </ItemGroup>

</Project>

来源:https://docs.microsoft.com/fr-fr/dotnet/standard/frameworks

【讨论】:

  • 感谢您的意见,但为什么它必须是两个不同的标签(&lt;TargetFramework&gt;&lt;TargetFrameworks&gt;),而不仅仅是其中一个?
  • @Noceo 我同意只有一个标签会更简单,但我想这是开发人员的选择,您可以通过在此处打开问题来询问他们:github.com/dotnet/core/issues
  • 我可能会这样做。听到设计背后的想法会很有趣:-)
  • 当您只设置复数 TargetFrameworks 属性时,如何在 ItemGroup 条件中使用非复数 TargetFramework 属性?
【解决方案2】:

在构建将在 .Net Full Framework 和 .Net Core Framework 中运行良好的类库时,您可以使用 TargetFrameworks 配置。这是此配置的最佳用例

如果您正在构建网站或 webapi,则使用多目标框架是没有意义的。在这种情况下,只使用一个目标框架。

【讨论】:

  • 感谢您的意见。我的问题更针对于为相同的功能制作两种不同的措辞的决定(如我所见)。我没有得到那个实现。我确实知道(至少我认为我知道)如何使用它......
  • 嗯,但它不是同一个功能.. 它是相似的。如果您只想针对一个框架(又名 .net 核心,它不能在 .net 经典上运行),那么将它们放入 TargetFramework。如果您想在 .net framework classic 和 .net core 中运行您的应用程序,您需要将此设置放在 TargetFrameworks 中。我同意你的看法,这有点奇怪,这将是一个配置:targetFramework。如果我只想要一个,就放一个。如果我想要不止一个,把所有我们想要的。但是,它是原样的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 2011-12-26
  • 2014-03-04
  • 1970-01-01
相关资源
最近更新 更多