どのようにcsprojで.NET Coreクラスライブラリをマルチターゲットしますか?


94

.NET Coreがまだこのproject.json形式を使用している場合、複数のフレームワーク(net451、netcoreapp1.0など)をターゲットとするクラスライブラリ構築できます。

公式のプロジェクト形式がcsprojMSBuildを使用しているので、ターゲットにする複数のフレームワークをどのように指定しますか?私はVS2017でのプロジェクト設定からこれを見てしようとしていますが、私は(それも、私は他の完全な.NET Frameworkのバージョンが表示されませんだけで、.NETのコアフレームワークから単一のフレームワークをターゲットにすることができる午前インストールされているが) :

ここに画像の説明を入力してください


それは想定されているものとは異なり、ドロップダウンにリストされている.NETStandard 1.xの選択肢を取得する必要があります。これがどのように発生したかは明確ではありません。開始するには、適切なプロジェクトテンプレートを選択してください。「クラスライブラリ(.NET標準)」である必要があります。コンソールアプリテンプレートを選択し、プロパティの変更を開始したようですが、正しい方法ではありません。実際にクラスライブラリテンプレートを使用した場合、インストールはうまくいきませんでした。
Hans Passant 2017年

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

2
そう、マルチターゲットにしたいなら、それは間違っている。ライブラリを複数のプラットフォームで使用できるようにするには、.NETStandardを選択する必要があります。
Hans Passant 2017年

それはそれをクリアします。必要に応じて、コメントから回答を書き込むことができます。
ジジ

回答:


119

手動で編集したプロジェクトファイルを必要とし、追加のをデフォルトにTargetFrameworkと、基本的に変更しTargetFrameworks。そして、あなたは言及モニカをしてセパレータ。

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

.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ファイルを見て、その構成を行う方法を理解します。

モニカーなしでより難解なターゲットをマルチターゲット化する:

マイクロソフト:

PCLは推奨されません+

PCLはサポートされていますが、パッケージ作成者は代わりにnetstandardをサポートする必要があります。。

ポータブルプロファイルを対象とする場合は、事前定義されたモニカがないため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>

1
csprojを手動で編集してこれを行う必要がありますか、それともVSを介して行うことができますか?
ジジ

1
@Gigiマルチターゲティングは手動で行う必要があります。Nugetパッケージは、VS2017を介して、または手動で実行できます。
Aboo

2
私は同じ問題を抱えていて、<TargetFramework>にsを追加した後、すべてがうまくいきました。これらのことをもっとよく文書化してほしい。
Negorath 2017年

2
@AsadSaeeduddinの可能性は、ResharperがVisual Studioではなく波線を表示していることです。$(TargetFramework)は、ItemGroupを特定のフレームワーク/モニカーで利用できるようにするために使用されます。
Aboo

2
@ORMapper NuGetパッケージが正しく構築されている場合、これはインポート時に自動的に行われます。つまり、NuGetPackageAがすでに複数のフレームワークをサポートしている場合は、条件付きのアイテムグループに配置する必要はありません。ここで、.netフレームワークのPackageAと.netコアのPackageBを参照する必要がある場合は、条件付きのアイテムグループに配置する必要があります。今日(2017年10月)の時点では、インターフェースにオプションはありません。
2017年

24

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

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

たとえば、httpsEFCore.csproj//github.com/aspnet/EntityFrameworkCore/blob/951e4826a38ad5499b9b3ec6645e47c825fa842a/src/EFCore/EFCore.csprojの例をご覧ください。


9
ありがとう!それは私を殺します。40年前に書かれたブライアンカーニガンの「プログラミングスタイルの要素」では、最後の1文字が異なる変数を使用することの誤りについて語っています。名前が "TargetFrameworkList"であると、はるかに明確になります。
ハワードロ2017

あなたが指す例には、<TargetFrameworks>プロパティが含まれていません。
RenniePet 2018年

@RenniePet、ありがとう!プロジェクトファイルは時間とともに変更されました。<TargetFrameworks>がある具体的なコミットにリンクを変更しました。
夜間歩行者2018年

12

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

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

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

うまくいけば、彼らはそのリンクされた記事を更新し続けます。これは流動的です。.NETStandard2.0は釘付けにされましたが、まだ出荷されていません。2017年の第2四半期をターゲットに、おそらく春の終わりに、現在97%が完了していると表示されます。1.5または1.6の使用は推奨されておらず、2.0との十分な互換性がないとデザイナーに聞いた


ターゲットフレームワークごとに異なる依存関係がある場合、どのように機能しますか?つまりproject.json、ターゲットフレームワークの特定の依存関係を指定できます。
ジジ

1
私はあなたがこれが今まで存在したことを忘れる必要があると90%確信しています。これは、.NETCoreをブートストラップするための一時的な対策にすぎない、混乱を招く混乱でした。リンクした互換性グリッドを使用します。
ハンスパッサント

私も疑いました。明確にしてくれてありがとう!
ジジ

4
@HansPassantマルチターゲットは、レガシーコードがあり、同時にグリーンフィールド開発を最近の完全なフレームワークフレーバーまたはdotnetcoreのいずれかで実行できる場合は、依然として最良のオプションです。
Stefano Ricciardi 2017

1
グリーンフィールドでさえ、必ずしも.NET Coreに対応しているとは限りません。Azure Function Appsを使用していますが、.NET Coreバージョンはいくつかのトリガーしかサポートしていません。(Service Busトリガーが必要なため、.NET Frameworkに行き詰まり、非常に大規模なビジネス機能ライブラリがマルチターゲットとして機能する可能性があります。)マイクロソフトのプラットフォームは、今、複雑に絡み合っています。これはDLL Hellに相当する最新のものです。
McGuireV10

5

私は、マルチターゲットネットフレームワークとネットコアの初心者向けガイドを作成しました。このガイドでは、簡単な1行の修正から始めて、それぞれの複雑な問題について説明します。

最も簡単な方法は、netcoreまたはnetstandardターゲットを最初に機能させることです。次に、csprojファイルを編集し、他のターゲットについてこれらの手順を実行します。

  1. csprojファイルの条件付きセクションについて学び、ターゲットごとに異なる依存関係を宣言できるようにします。ターゲットごとに条件付きセクションを作成します。
  2. <Reference />sビルドエラーメッセージで不足していると言う内容を読み取るだけで、任意のネットフレームワークターゲットのSystem。* dllを追加します。
  3. <PackageReference />sターゲットごとに異なる場合は、NuGetの依存関係を処理します。最も簡単なトリックは、一時的に単一のターゲット設定に戻し、GUIがNugetの参照を正しく処理できるようにすることです。
  4. すべてのターゲットでコンパイルされないコードに対処するには、さまざまな独創的な手法、回避策、および時間の節約を学びます。
  5. ターゲットを追加するコストが高すぎるときに、損失を削減するタイミングを把握します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.