TargetFramework 与 TargetFrameworks(复数)

Noc*_*ceo 8 c# target-framework .net-core

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

<PropertyGroup>
  <TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

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

<PropertyGroup>
  <TargetFrameworks>netcoreapp2.2;net4.6</TargetFrameworks>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

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

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

Fou*_*rat 9

基本上,当您想要针对单个框架时,您可以使用<TargetFramework>标签(在您正在构建针对 .net-core 的应用程序的情况下),但您也可以通过使用有条件地引用程序集多个框架<TargetFrameworks>(如果您是为 .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>
Run Code Online (Sandbox Code Playgroud)

来源: https: //learn.microsoft.com/dotnet/standard/frameworks

  • 我可能会这么做。听到设计背后的想法会很有趣:-) (2认同)

小智 -1

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

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