В файле .csproj в моих проектах .NET Core по умолчанию есть эти 3 строки:

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

Теперь, если я хочу настроить таргетинг на несколько фреймворков, я могу изменить его на это:

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

Разница небольшая, но она есть. При нацеливании на несколько фреймворков вы должны использовать <TargetFrameworks> (множественное число) вместо просто <TargetFramework> (единственное число).

Но почему это сделано именно так? Похоже, было бы проще просто выбрать одно из двух и потом всегда использовать его. Это наводит меня на мысль, что для выбора разных (хотя и похожих) слов может быть более сложная причина, в зависимости от того, нацелены ли вы на большее количество фреймворков. Может ли кто-нибудь просветить меня по теме?

9
Jakob Busk Sørensen 5 Дек 2019 в 12:35
Они сделали то, что они сделали, чтобы помочь программистам с существующими проектами (почти для всех) перейти на .NETCore. Некоторое время они будут продолжать развертывание на .NETFramework, но можете быть уверены, что когда они, наконец, примут .NETCore, не будет сюрпризов. Со временем это исчезнет.
 – 
Hans Passant
5 Дек 2019 в 14:28

2 ответа

Вы можете использовать конфигурацию TargetFrameworks при создании библиотеки классов, которая будет хорошо работать в .Net Full Framework и .Net Core Framework. Это лучший вариант использования данной конфигурации

Нет смысла использовать несколько целевых фреймворков, если вы создаете веб-сайт или webapi. В этом случае используйте только одну целевую платформу.

0
Anderson Ribeiro 5 Дек 2019 в 12:47
1
Спасибо за ваш вклад. Мой вопрос был больше направлен на решение сделать две разные формулировки для одних и тех же функций (как я это вижу). Я не понимаю этой реализации. Я понимаю (по крайней мере, думаю, что знаю), как им пользоваться ...
 – 
Noceo
5 Дек 2019 в 14:04
Хммм, но это не та особенность .. она похожа. Если вы хотите настроить таргетинг только на один фреймворк (он же ядро ​​.net, и он не работает в классическом .net), поместите их в TargetFramework. Если вы хотите запускать свое приложение как в классической среде .NET Framework, так и в ядре .NET, вам необходимо установить этот параметр в TargetFrameworks. Согласен с вами, это немного странно, это была бы одна конфигурация: targetFramework. Если я хочу только один, поставьте его. Если я хочу больше одного, кладем все, что хотим. Но это как есть.
 – 
Anderson Ribeiro
5 Дек 2019 в 14:37

Обычно, когда вы хотите настроить таргетинг на одну платформу, вы используете тег <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>

Источник: https://docs.microsoft.com/fr-fr/dotnet/ стандарт / рамки

0
Tim 21 Фев 2020 в 12:20
Я ценю ваш вклад, но почему это должны быть два разных тега (<TargetFramework> и <TargetFrameworks>), а не только один из них?
 – 
Noceo
5 Дек 2019 в 14:06
Я согласен, что было бы проще иметь только один тег, но я предполагаю, что это был выбор разработчиков, вы можете спросить их, открыв вопрос здесь: github.com/dotnet/core/issues
 – 
Fourat
5 Дек 2019 в 14:55
2
Я мог бы это сделать. Было бы интересно услышать мысль, стоящую за дизайном :-)
 – 
Noceo
5 Дек 2019 в 15:46