プロジェクトを整理し、.NET Framework と .NET Core をサポートする

この記事は、プロジェクト所有者が横並びの .NET Framework と .NET Core に対してソリューションをコンパイルするときに役立ちます。 プロジェクトを整理するためのオプションを提供し、開発者を支援します。 ここでは、.NET Core でプロジェクト レイアウトを設定する方法について決定するときに考慮する典型的なシナリオを紹介します。 プロジェクトのニーズに基づいて選択されており、すべてを網羅していないかもしれません。

  • 既存のプロジェクトと .NET Core プロジェクトを結合し、シングル プロジェクトを作成する

    効果:

    • 複数のプロジェクトをコンパイルするのではなく、シングル プロジェクトをコンパイルすることでビルド プロセスをシンプルにします。それぞれ、異なる .NET Framework バージョンまたはプラットフォームをターゲットにします。
    • ターゲットが複数のプロジェクトのソース ファイル管理をシンプルにします。シングル プロジェクト ファイルを管理することになります。 ソース ファイルの追加/削除時、代替方法では、これらを他のプロジェクトと手動で同期する必要があります。
    • 使用する NuGet パッケージを簡単に生成します。
    • コンパイラ ディレクティブを利用することで、ライブラリの特定の .NET Framework バージョンに対してコードを記述できます。

    サポートされていないシナリオ:

  • 既存のプロジェクトと新しい .NET Core プロジェクトを別々に保存する

    効果:

    • 既存のプロジェクトで引き続き開発をサポートします。Visual Studio 2015 を所有していない開発者/貢献者はアップグレードする必要がありません。
    • 既存のプロジェクトで新しいバグが発生する可能性が減ります。既存のプロジェクトではコード チャーンが要求されないためです。
  • 既存のプロジェクトを保持し、.NET Core をターゲットにするポータブル クラス ライブラリ (PCL) を作成する

    効果:

    • デスクトップまたは Web プロジェクトで .NET Core ライブラリを参照し、同じソリューションの完全 .NET Framework をターゲットにします。
    • プロジェクト ビルドまたは読み込みプロセスで変更をサポートします。 変更とは、たとえば、*.csproj ファイルに MSBuild のタスクやターゲットを追加することです。

    サポートされていないシナリオ:

    • 特定の .NET Framework バージョンのコードを記述することはできません。定義プリプロセッサ記号がサポートされていないためです。

次のリポジトリを考慮してください。

既存のプロジェクト

ソース コード

下に説明する既存のプロジェクトの制約や複雑性にもよりますが、このリポジトリのために .NET Core のサポートを追加する方法がいくつかあります。

既存のプロジェクトとターゲットが複数ある .NET Core Project (xproj) を置換します

リポジトリを再整理できます。既存の *.csproj ファイルが削除され、複数のフレームワークをターゲットにするシングル *.xproj ファイルが作成されます。 異なるフレームワークに対してシングル プロジェクトでコンパイルできるので、この方法が推奨されます。 さまざまなコンパイル オプション、依存関係などを処理することもできます。 対象のフレームワークごとに。

複数のフレームワークをターゲットにする xproj の作成

ソース コード

注目するべき変更点:

  • global.json の追加
  • packages.config および *.csprojproject.json および *.xproj に置換
  • Car の project.json とそのテスト プロジェクト を、既存の .NET Framework などのビルドをサポートするように変更

ポータブル クラス ライブラリ (PCL) を作成し、.NET Core をターゲットにします。

既存のプロジェクトの *.csproj ファイルに複雑なビルド操作やプロパティが含まれる場合、PCL を簡単に作成できることがあります。

ソース コード

注目するべき変更点:

  • project.json の名前を {project-name}.project.json に変更
    • これにより、Visual Studio で、同じディレクトリのライブラリのパッケージを復元しようとしたときの競合が回避されます。 詳細については、NuGet FAQ の "I have multiple projects in the same folder, how can I use separate packages.config or project.json files for each project?" (同じフォルダーに複数のプロジェクトがあります。プロジェクトごとに別々の packages.config ファイルまたは project.json ファイルを利用できますか。) を参照してください。
    • 代替方法: 別のフォルダーで PCL を作成し、元のソース コードを参照することでこの問題を回避します。 別のフォルダーに PCL を置くことには長所があります。Visual Studio 2015 を所有していないユーザーも新しいソリューションを読み込まずに古いプロジェクトを使用できます。
  • PCL の作成後、.NET Standard をターゲットにするには、Visual Studio で、プロジェクトのプロパティを開きます。 [ターゲット] セクションで、"Target .NET Platform Standard" (.NET Platform Standard をターゲットにする) リンクをクリックします。 同じ手順を繰り返せば、この変更を元に戻すことができます。

既存のプロジェクトを保持し、.NET Core プロジェクトを作成します

古いフレームワークをターゲットにする既存のプロジェクトがあるとき、そのようなプロジェクトをそのまま残し、.NET Core プロジェクトを利用して今後のフレームワークをターゲットにすると効率的な場合があります。

別のフォルダーに既存の PCL がある .NET Core プロジェクト

ソース コード

注目するべき変更点:

  • .NET Core と既存のプロジェクトを別々のフォルダーに保存します。
    • これにより、複数の project.json/package.config ファイルが同じフォルダーに存在することに起因する前述のパッケージ復元問題が回避されます。
    • プロジェクトを別々のフォルダーに保存すれば、(project.json により) Visual Studio 2015 を所有する必要がありません。 古いプロジェクトだけを開く別個のソリューションを作成できます。

関連項目

project.json と xproj に移行する方法に関する詳細については、.NET Core の移植に関するドキュメントのページを参照してください。