web-dev-qa-db-ja.com

.NET Core RuntimeIdentifierとTargetFramework

誰かがcsprojファイル(VS2017)でこの2つの目的を説明できますか?

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

VS2015から移行したばかりですが、1つのターゲットフレームワークのみを使用する必要があるように見えるため、Web APIを公開できません。また、複数のRIDを指定することはできません。これらの変更されたすべてのことは私をイライラさせます。ゼロから機能するものは何もなく、何度も何度も克服する必要があります。

Windowsでweb-apiを開発し、ここでxUnitテストを実行してから、web-apiをデプロイしてLinux(ubuntu)サーバーで実行したいだけです。 csprojの両方のパラメーターに何を入れるべきですか?説明の良いリンクは大歓迎です。

pdate1

参照された.netコアライブラリを持つWeb APIがあります。 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):エラー: 'Publish'ターゲットは指定せずにサポートされていませんターゲットフレームワーク。現在のプロジェクトは複数のフレームワークを対象としています。公開アプリケーションのフレームワークを指定してください。

しかし、パブリッシュでターゲットフレームワークを_netcoreapp1.1_として指定しました。 OK。次に、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'のこのプロジェクトを復元したことを確認してください。

Windows 8.1/windows7でVS2017を使用して開発し、ubuntu 16.10にデプロイするだけです。私が間違っているのは何ですか?

pdate2

ソリューションには8つのプロジェクトがあります。それらの3つはxUnitテストです。したがって、5つのプロジェクトがあります。これら5つのうち4つはクラスライブラリであり、1つは私のWebアプリです。 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>
_

Webアプリを公開するには?

16
Alezis

<TargetFramework>(または<TargetFrameworks>、1つまたは複数のnet451など、複数のターゲットが必要な場合はnetstandard1.x)。 <TargetFramework>/<TargetFrameworks>エントリごとに、アセンブリセットが1つ作成され、bin\Debug\<targetframeworkid>内に配置されます。

これは、.NET Coreで別のライブラリを使用する場合(使用したライブラリは4.5.1などの完全な.NET Frameworkでのみ動作するため)、またはサポートされていないため.NET Coreからこの機能を削除する場合に便利です。

構築とNuGet復元の両方に使用されます。つまり、.NET Coreプロジェクトではnet451のみのライブラリを使用できません(たとえば、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>は、Win7(x64およびx86)バージョン用のnuget復元パッケージと、ubuntu専用のx64を作成します。これは、Windowsで作業する場合、これらのネイティブライブラリもダウンロードする必要があるため、dotnet publishで展開/パッケージ化する必要があるためです。

ただし、ちょっとした落とし穴があります。<TargetFramework>または<TargetFrameworks>に完全な.NET Framework参照がある場合、単一の<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>
17
Tseng

RIDはRuntime IDentifierの略です。 RIDは、アプリケーションまたは資産(つまり、アセンブリ)が実行されるターゲットオペレーティングシステムを識別するために使用されます。 「ubuntu.14.04-x64」、「win7-x64」、「osx.10.11-x64」のようになります。ネイティブの依存関係を持つパッケージの場合、パッケージを復元できるプラットフォームを指定します。

docs の詳細

最初に、適切なRIDをwin7からwin7-x64またはwin7-x86に変更します。次に、ubuntuなどの他のRIDを追加します。例えば:

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

見栄えの良いターゲットフレームワーク。詳細については docs

2
J. Doe