Как настроить таргетинг на несколько фреймворков в финале VS2017?

Для ядра ASP.NET я мог бы использовать несколько фреймворков (например, netcoreapp1.1 и dnx451) в одном проекте Project.json:

"frameworks": {
   "netcoreapp1.1": {
     "dependencies": {
       "Microsoft.NETCore.App": {
         "version": "1.1.0",
         "type": "platform"
       }
     },
     "imports": [
       "dotnet5.6",
       "portable-net45+win8"
     ]
   },
   "dnx451": {}
 },

В окончательной версии Visual Studio 2017 я могу ориентироваться только на netcoreapp1.1 или dnx451, но я не вижу возможности настроить таргетинг на оба.

Я попытался отредактировать файл csproj напрямую, чтобы добавить вторую структуру, установив либо <TargetFramework>netcoreapp1.1;dnx451</TargetFramework>, либо даже <TargetFrameworks>netcoreapp1.1;dnx451</TargetFrameworks>, но получив ошибки в Visual Studio из-за неподдерживаемых фреймворков.

Итак, как настроить таргетинг как на netcoreapp1.1, так и на dnx451 в одном проекте в окончательной версии Visual Studio 2017?

Ответ 1

Будет несколько вещей, которые вам нужно изменить. Сначала тег <TargetFrameworks> является правильным для мультитаргетинга, а ; - разделителем.

DNX устарел при разработке RC2, поэтому последняя версия, поддерживающая DNX, была RC1. Моник dnxcore5x (и более поздний dotnet5.x) заменен на netstandard1.x (для библиотек классов) и netcoreapp1.x для приложений. dnx4xx устарел в целом и net4xx должен использоваться.

Кроме того, когда вы нацеливаете .NET Framework (отдельно или с .NET Core/NetStandard), вам нужно будет определить идентификатор времени выполнения:

<RuntimeIdentifier>win7-x86</RuntimeIdentifier>

или

<RuntimeIdentifier>win7-x64</RuntimeIdentifier>

Или в зависимости от того, что вы хотите по умолчанию.

Update

Также как дополнительная информация. Когда вы нацеливаете более одной платформы, вам нужно использовать условные обозначения для разрешения пакета, т.е. Condition="'$(TargetFramework)' == '<targetmoniker>'

<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp1.1'">
    <PackageReference Include="Microsoft.NETCore.App">
      <Version>1.0.1</Version>
    </PackageReference>
</ItemGroup>

В противном случае вы можете получить ошибки восстановления пакета