Как вы многоцелектируете библиотеку классов .NET Core с помощью csproj?

Когда .NET Core по-прежнему использовал формат project.json, вы могли бы создать библиотеку классов ориентированную на несколько фреймворков (например, net451, netcoreapp1.0).

Теперь, когда официальный формат проекта csproj с использованием MSBuild, как вы указываете несколько фреймворков для таргетинга? Я пытаюсь найти это из параметров проекта в VS2017, но я могу использовать только одну структуру из рамок .NET Core (она даже не перечисляет другие полные версии .NET Framework, которые я установил)

введите описание изображения здесь

Ответ 1

Вам необходимо вручную отредактировать файл проекта и добавить s к стандартному TargetFramework и изменить его на TargetFrameworks. Затем вы упоминаете Moniker с разделителем ;.

Также вы можете поместить ссылки на пакеты Nuget в условную ItemGroup вручную или с помощью VS Nuget Package Manager.

Вот как должен выглядеть ваш .csproj:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netstandard1.6;net452</TargetFrameworks>
  </PropertyGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'net452'">
    <PackageReference Include="Microsoft.Azure.DocumentDB">
      <Version>1.12.0</Version>
    </PackageReference>
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard1.6'">
    <PackageReference Include="Microsoft.Azure.DocumentDB.Core">
    <Version>1.1.0</Version>
    </PackageReference>
  </ItemGroup>
</Project>

Еще один обходной путь, который я делаю в эти дни из-за отсутствия документации, заключается в том, что я создаю проект в VS2015 и формирую project.json, используя доступную документацию и intellisense, затем открываю решение в VS2017 и использую встроенное обновление. Затем я посмотрю на файл csproj, чтобы выяснить, как выполнить эту настройку.

Многоцелевое нацеливание на более эзотерические цели без Moniker:

Microsoft:

PCL не являются recommended+

Хотя PCL поддерживаются, авторы пакетов должны поддерживать Нетстандарт вместо. Платформа .NET Standard - это эволюция PCL и представляет двоичную переносимость между платформами, используя один Моникер, который не привязан к статике, как, например, переносимые а + В + С.

Если вы хотите настроить таргетинг на переносной профиль, у него нет предопределенного названия, поэтому переносимые профили также не могут выводить TargetFrameworkIdentifier, TargetFrameworkVersion и TargetFrameworkProfile. Также константа компилятора не определяется автоматически. Наконец, вы должны добавить все ссылки на сборки, ни одна из которых не предоставлена по умолчанию.

Этот пример, приведенный ниже, взят из проекта, в котором использовалось ключевое слово dynamic, поэтому ему дополнительно требовалась сборка Microsoft.CSharp, поэтому вы можете увидеть, как она ссылается на разные цели.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netstandard1.5;net40;portable40-net45+sl5+win8+wp8</TargetFrameworks>
  </PropertyGroup>

  <PropertyGroup Condition="'$(TargetFramework)'=='portable40-net45+sl5+win8+wp8'">
    <TargetFrameworkIdentifier>.NETPortable</TargetFrameworkIdentifier>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    <TargetFrameworkProfile>Profile158</TargetFrameworkProfile>
    <DefineConstants>$(DefineConstants);PORTABLE158</DefineConstants>
  </PropertyGroup>

  <ItemGroup Condition="'$(TargetFramework)'=='netstandard1.5'">
    <PackageReference Include="Microsoft.CSharp" Version="4.3.0" />
    <PackageReference Include="System.ComponentModel" Version="4.3.0" />
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)'=='net40'">
    <Reference Include="Microsoft.CSharp" />
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)'=='portable40-net45+sl5+win8+wp8'">
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Windows" />
  </ItemGroup>
</Project>

Ответ 3

Я на самом деле выбрал библиотеку классов (.NET Core).

Это не тот шаблон проекта, который вам нужен, если ваша библиотека должна работать с несколькими целевыми платформами. С этим шаблоном проекта ваша библиотека может использоваться только в проекте, который нацелен на .NETCore. Подход библиотеки PCL был удален, теперь вам нужно выбрать .NETStandard.

Это можно сделать, запустив проект с помощью шаблона проекта "Библиотека классов (.NET Standard)". Теперь у вас есть возможность выбрать версию .NETStandard. Текущая сетка совместимости здесь.

Надеюсь, они обновят эту связанную статью. Это происходит постоянно,.NETStandard 2.0 был закрыт, но пока не поставляется. Ориентированный на второй квартал 2017 года, конец весны, вероятно, в настоящее время составляет 97%. Я слышал, как дизайнеры говорили, что использование 1.5 или 1.6 не рекомендуется, недостаточно совместимо с 2.0

Ответ 4

Я сделал руководство для начинающих по сетевой среде с многоцелевым таргетингом и netcore.

Самый простой подход - заставить цель netcore или netstandard работать первой. Затем отредактируйте файл csproj и выполните эти шаги для других целей.

  1. Узнайте об условных разделах в вашем файле csproj, чтобы вы могли объявить различные зависимости для каждой цели. Создайте условные разделы для каждой цели.
  2. Добавьте <Reference />s для System. * Dll для любых целей netframework, просто прочитав, что в сообщениях об ошибках сборки не хватает.
  3. Обработайте зависимости NuGet <PackageReference />s в тех случаях, когда они не одинаковы для каждой цели. Самый простой трюк - временно вернуться к одиночному нацеливанию, чтобы графический интерфейс правильно обрабатывал ссылки на Nuget.
  4. Работайте с кодом, который не компилируется по всем целям, изучая творческое разнообразие методов, обходных путей и экономию времени.
  5. Знайте, когда сократить свои потери, когда стоимость добавления новых целей слишком высока.