.NET Core RuntimeIdentifier vs TargetFramework

Может кто-то объяснить цель этих двух в файле csproj (VS2017):

<TargetFramework>netstandard1.6</TargetFramework>
<RuntimeIdentifier>win7</RuntimeIdentifier>

Я просто перешел из VS2015 и теперь не могу опубликовать свой веб-api, потому что, похоже, я должен использовать только одну целевую структуру. Кроме того, я не могу указать несколько RID. Все эти измененные вещи меня расстраивают. Ничто не работает с нуля, нужно что-то преодолевать снова и снова.

Я просто хочу разработать свой веб-api на windows, запустить тесты xUnit, а затем развернуть web-api для запуска на сервере linux (ubuntu). Что мне следует включить в оба параметра в csproj? Ссылки с хорошим объяснением высоко ценятся.

Update1

У меня есть веб-api с указанными основными библиотеками.net. Все, что перенесено из VS2015. Теперь в корневом проекте у меня есть <TargetFrameworks>netcoreapp1.1;net461</TargetFrameworks>. Когда я публикую через VS2017, я получил ошибку:

C:\Program Files\dotnet\sdk\1.0.3\Sdks\Microsoft.NET.Sdk\buildCrossTargeting\Microsoft.NET.Sdk.targets(31,5): ошибка: цель "Опубликовать" не поддерживается без указания целевой структуры. Текущий проект рассчитан на несколько рамок, пожалуйста, укажите рамки для опубликованного приложения.

Но я указал целевую структуру в публикации как netcoreapp1.1. ХОРОШО. Затем я обновил свой csproj с помощью <PropertyGroup Condition="$(TargetFramework)'=='netcoreapp1.1'"> <RuntimeIdentifier>ubuntu.16.10-x64</RuntimeIdentifier> </PropertyGroup> как предлагается ниже. Но теперь я даже не могу создать приложение, получить ошибку:

5> C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.Sdk.targets(92,5): ошибка: файл активов '\ obj\project.assets.json 'не имеет цели для'.NETCoreApp, Version = v1.1/ubuntu.16.10-x64 '. Убедитесь, что вы восстановили этот проект для TargetFramework = 'netcoreapp1.1' и RuntimeIdentifier = 'ubuntu.16.10-x64'.

Я просто хочу разработать с VS2017 в Windows 8.1/Windows 7 и развернуть на ubuntu 16.10. Что я делаю неправильно?

Update2

У меня есть 8 проектов в решении. 3 из них - тесты xUnit. Таким образом, у нас есть 5 проектов. 4 из этих 5 являются библиотеками классов, а 1 - моим веб-приложением. Все 4 библиотеки классов имеют следующее:

<TargetFrameworks>netstandard1.6;net461</TargetFrameworks>    
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
    <Reference Include="System" />
    <Reference Include="Microsoft.CSharp" />
</ItemGroup>

Мое веб-приложение:

<TargetFrameworks>netcoreapp1.1;net461</TargetFrameworks>
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
    <Reference Include="System" />
    <Reference Include="Microsoft.CSharp" />
  </ItemGroup>

Как опубликовать мое веб-приложение?

Ответ 1

<TargetFramework> (или <TargetFrameworks> если вы хотите иметь несколько целей, например net451, один или несколько netstandard1.x т.д.). В записи <TargetFramework>/<TargetFrameworks> будет создан один набор сборок и будет находиться внутри bin\Debug\<targetframeworkid>).

Это полезно, если вы хотите использовать другую библиотеку в.NET Core (потому что библиотека, которую вы использовали, работает только с полной.NET Framework, такой как 4.5.1), или удалите эту функцию из.NET Core, потому что она не поддерживается.

Он используется как для восстановления зданий, так и для восстановления NuGet. т.е. вы не можете использовать только библиотеку net451 в проекте.NET Core (например, netstandard 1.1 но вы можете использовать netstandard1.1 в проекте net451)

<RuntimeIdentifier>/<RuntimeIdentifiers> с другой стороны используется в основном для NuGet. Он сообщает NuGet, какие пакеты вам нужны. Например, если вы хотите настроить таргетинг на Linux, Mac и Windows, некоторые сборки требуют наличия собственных библиотек (таких как шифрование. В Windows CryptoAPI будет использоваться, но для Linux и Mac вам нужен OpenSSL). Это включает в себя не управляемые DLL и *.so(Linux) файлы.

т.е. <RuntimeIdentifiers>win7-x64;win-7x86;ubuntu.16.10-x64</RuntimeIdentifiers> сделает пакеты восстановления <RuntimeIdentifiers>win7-x64;win-7x86;ubuntu.16.10-x64</RuntimeIdentifiers> для версий win7 (x64 и x86) и x64 только для ubuntu. Это необходимо, потому что, когда вы работаете с окнами, вам необходимо также загрузить эти родные библиотеки, чтобы вы разворачивали их /dotnet publish.

Здесь немного уловить: когда у вас есть полная ссылка.NET Framework в <TargetFramework> или <TargetFrameworks>, тогда вы должны указать один <RuntimeIdentifier> (единственное, а не множественное <RuntimeIdentifiers>), иначе вы получите сообщение об ошибке.

Например:

<PropertyGroup>
    <TargetFrameworks>netstandard1.0;net451</TargetFrameworks>
    <RuntimeIdentifiers>win7-x64;win-7x86;ubuntu.16.10-x64</RuntimeIdentifiers>    
</PropertyGroup>

<!-- This entry will only be used for the .NET Framework 4.5.1 output -->
<PropertyGroup Condition="'$(TargetFramework)' == 'net451'">
    <RuntimeIdentifier>win7-x64</RuntimeIdentifier>
</PropertyGroup>

Ответ 2

RID является коротким для идентификатора времени выполнения. RID используются для идентификации целевых операционных систем, в которых будет выполняться приложение или актив (то есть сборка). Они выглядят так: "ubuntu.14.04-x64", "win7-x64", "osx.10.11-x64". Для пакетов с родными зависимостями он будет определять, на каких платформах пакет может быть восстановлен.

Больше в документах

Сначала измените правильное RID от win7 до win7-x64 или win7-x86. Затем добавьте другой RID, такой как ubuntu. Например:

<PropertyGroup>
    <TargetFramework>netstandard1.6</TargetFramework>
    <RuntimeIdentifier>win7-x64;ubuntu.16.10-x64</RuntimeIdentifier>
</PropertyGroup>

Целевая структура выглядит хорошо. Для более читаемых документов