web-dev-qa-db-ja.com

csprojで.NET Coreクラスライブラリをマルチターゲットにするにはどうすればよいですか?

.NET Coreがまだproject.json形式を使用している場合は、クラスライブラリを構築できます 複数のフレームワークを対象とする (例:net451、netcoreapp1.0)。

MSBuildを使用した公式プロジェクトの形式はcsprojになったので、ターゲットにする複数のフレームワークをどのように指定しますか?私はVS2017のプロジェクト設定からこれを探していますが、.NET Coreフレームワークの単一のフレームワークのみをターゲットにすることができます(他の完全な.NET Frameworkバージョンもリストしていませんdoインストール済み):

enter image description here

72
Gigi

プロジェクトファイルを手動で編集し、デフォルトのTargetFrameworksを追加し、基本的にTargetFrameworks。次に、 Moniker;セパレータを付けて言及します。

また、手動で、またはVS Nuget Package Managerを使用して、Nugetパッケージ参照を条件付きItemGroupに配置できます。

.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を形成し、VS2017でソリューションを開き、組み込みのアップグレードを使用することです。次に、csprojファイルを見て、その構成を実現する方法を見つけます。

Monikerなしで、より難解なターゲットをマルチターゲティングする

マイクロソフト:

PCLは推奨されません+

PCLはサポートされていますが、パッケージ作成者は代わりにnetstandardをサポートする必要があります。 .NET Platform StandardはPCLの進化版であり、portable-a + b + cモニカのような静的に結び付けられていない単一のモニカを使用して、プラットフォーム間でのバイナリポータビリティを表します。

ポータブルプロファイルをターゲットにする場合、事前定義されたmonikerがないため、ポータブルプロファイルはTargetFrameworkIdentifierTargetFrameworkVersion、および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>
94
Aboo

このために.csprojファイルを手動で編集し、TargetFrameworksTargetFrameworkではありません)プロパティを設定できます。

<TargetFrameworks>net451;netstandard1.4</TargetFrameworks>

たとえば、EFCore.csprojを参照してください。 https://github.com/aspnet/EntityFrameworkCore/blob/951e4826a38ad5499b9b3ec6645e47c825fa842a/src/EFCore/EFCore.csproj

22
Night walker

実際にクラスライブラリ(.NET Core)を選択しました。

ライブラリが複数のプラットフォームターゲットで動作する必要がある場合、これは必要なプロジェクトテンプレートではありません。このプロジェクトテンプレートを使用すると、ライブラリは.NETCoreをターゲットとするプロジェクトでのみ使用できます。 PCLライブラリアプローチは廃止され、.NETStandardを選択する必要があります。

これを行うには、「クラスライブラリ(.NET標準)」プロジェクトテンプレートを使用してプロジェクトを開始します。 .NETStandardバージョンを選択するオプションがあります。現在の互換性グリッド ここにあります

リンクされた記事が常に更新されることを願っています。これは流動的で、.NETStandard 2.0は打ち切られましたが、まだ出荷されていません。おそらく春の終わり、2017年の第2四半期を目標としており、現在97%完了と表示されています。 1.5または1.6の使用は推奨されておらず、2.0との互換性が十分ではないと言っているデザイナーを耳にします

11
Hans Passant

マルチターゲットネットフレームワークとネットコアの初心者向けガイド を作成しました。

最も簡単なアプローチは、最初に1つのnetcore/netstandardターゲットを動作させてから、csprojファイルを編集し、他のターゲットに対して次の手順を実行することです。

  1. ターゲットごとに異なる依存関係を宣言できるように、csprojファイルの条件付きセクションについて学習します。各ターゲットの条件付きセクションを作成します。
  2. System。*の<Reference />sを追加するには、ビルドエラーメッセージに欠落があることを読み取るだけで、ネットワークフレームワークターゲットに対応します。
  3. NuGetの依存関係<PackageReference />sは、ターゲットごとに異なる場合に対処します。最も簡単なトリックは、GUIがNugetの参照を正しく処理できるように、一時的に単一のターゲティングに戻すことです。
  4. 創造的なさまざまなテクニック、回避策、時間の節約を学ぶことで、すべてのターゲットでコンパイルされないコードを処理します。
  5. ターゲットを追加するコストが高すぎる場合に、いつ損失を削減するかを知ってください。
1
Chris F Carroll