Когда .NET Core все еще использовал этот project.json
формат, вы могли создать библиотеку классов, ориентированную на несколько платформ (например, net451, netcoreapp1.0).
Теперь, когда в официальном формате проекта csproj
используется MSBuild, как указать несколько целевых платформ? Я пытаюсь искать это в настройках проекта в VS2017, но я могу только целевой единую структуру из рамок .NET ядра (она даже не перечислить другие полные версии .NET Framework , которые я действительно установили) :
Ответы:
Вам нужно вручную отредактировать файл проекта и добавить s в TargetFramework по умолчанию и в основном изменить его на TargetFrameworks . Затем вы упоминаете прозвище с ; разделитель.
Также вы можете поместить ссылки на пакеты 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, чтобы выяснить, как выполнить эту настройку.
Мульти-нацеливание на более эзотерические цели без прозвища :
Microsoft:
Если вы хотите предназначаться Портативный профиль не имеет предопределенный прозвища так портативные профили также не может делать вывод
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>
источник
Вы можете вручную отредактировать
.csproj
файл для этого и установитьTargetFrameworks
(неTargetFramework
) свойство.<TargetFrameworks>net451;netstandard1.4</TargetFrameworks>
Например, см
EFCore.csproj
. Https://github.com/aspnet/EntityFrameworkCore/blob/951e4826a38ad5499b9b3ec6645e47c825fa842a/src/EFCore/EFCore.csprojисточник
Это не тот шаблон проекта, который вам нужен, если ваша библиотека должна работать на нескольких целевых платформах. С этим шаблоном проекта ваша библиотека может быть использована только в проекте, ориентированном на .NETCore. Подход с использованием библиотеки PCL был исключен, теперь вам нужно выбрать .NETStandard.
Это можно сделать, запустив проект с помощью шаблона проекта «Библиотека классов (.NET Standard)». Теперь у вас есть возможность выбрать версию .NETStandard. Текущая таблица совместимости находится здесь .
Надеюсь, они обновят эту связанную статью. Это постоянно меняется, .NETStandard 2.0 был прибит, но еще не выпущен. Ориентировано на второй квартал 2017 года, вероятно, на конец весны, в настоящее время выполнено 97%. Я слышал, как дизайнеры говорили, что использование 1.5 или 1.6 не рекомендуется, недостаточно совместимо с 2.0.
источник
project.json
вы можете указать конкретные зависимости для целевой платформы.Я сделал руководство для новичков по сетевой структуре и сетевому ядру с множественным таргетингом, которое начинается с простого исправления в одну строку, а затем проводит вас через каждую из сложностей.
Самый простой подход - сначала заставить работать цель netcore или netstandard. Затем отредактируйте файл csproj и выполните эти шаги для других целей.
<Reference />s
для System. * Dll для любых целей netframework, просто прочитав то, что в сообщениях об ошибках сборки указано, что отсутствует.<PackageReference />s
в тех случаях, когда они не одинаковы для каждой цели. Самый простой трюк - временно вернуться к одиночному нацеливанию, чтобы графический интерфейс правильно обрабатывал ссылки Nuget за вас.источник