複数のプロセッサを使用したプロジェクトのビルド

MSBuild では、複数のプロセッサまたはマルチコア プロセッサを搭載したシステムを使用できます。 プロセッサごとに個別のビルド プロセスが作成されます。 たとえば、4 つのプロセッサを搭載したシステムでは、4 つのビルド プロセスが作成されます。 MSBuild では、これらのビルドを同時に処理できるため、全体的なビルド時間が短縮されます。 ただし、並行ビルドでは、ビルド処理が行われる方法がいくつかの点で通常とは異なります。 このトピックでは、それらの相違点について説明します。

プロジェクト間参照

Microsoft Build Engine が並行ビルドによってプロジェクトをビルドしているときにプロジェクト間 (P2P) 参照を検出した場合は、その参照を 1 回のみビルドします。 2 つのプロジェクトに同じ P2P 参照がある場合、その参照はプロジェクトごとに再ビルドされません。 ビルド エンジンが同じ P2P 参照をそれに依存する両方のプロジェクトに返します。 それ以降にセッション内で同じターゲットが要求された場合は、同じ P2P 参照が返されます。

サイクルの検出

サイクルの検出は MSBuild 2.0 の場合と同じように機能します。ただし、MSBuild には現在、サイクルの検出を別の時点またはビルド時に報告する機能が追加されています。

並行ビルド中のエラーと例外

並行ビルドでは、通常のビルドとは異なる時点でエラーや例外が発生することがあり、あるプロジェクトのビルドが失敗した場合でも他のプロジェクトのビルドは続行されます。 MSBuild では、同時に実行されているプロジェクトのビルドのいずれかが失敗しても、他のビルドが停止されることはありません。 他のプロジェクトのビルドは、成功または失敗するまで続行されます。 ただし、ContinueOnError が有効である場合は、エラーが発生したビルドも停止しません。

Visual C++ のプロジェクト ファイル (.vcproj) とソリューション ファイル (.sln)

Visual C++ のプロジェクト ファイル (.vcproj) とソリューション ファイル (.sln) は、どちらも MSBuild タスクに渡すことができます。 Visual C++ プロジェクトでは、VCWrapperProject が呼び出され、内部 MSBuild プロジェクトが作成されます。 Visual C++ ソリューションについては、SolutionWrapperProject が作成され、次に内部 MSBuild プロジェクトが作成されます。 いずれの場合も、生成されるプロジェクトは他の MSBuild プロジェクトと同じように扱われます。

マルチプロセス実行

ビルドに関連するほとんどの操作では、パス関連のエラーを回避するために、ビルド プロセスの全体をとおして現在のディレクトリが変わらないことが必要です。 そのため、MSBuild では、スレッドごとにディレクトリが作成される可能性があるため、複数のスレッドでプロジェクトを実行することはできません。

この問題を回避し、マルチプロセッサによるビルドを可能にするために、MSBuild では "プロセス分離" が使用されます。 プロセス分離によって、MSBuild は最大 n のプロセスを作成できます。n はシステムで利用可能なプロセッサの数です。 たとえば、MSBuild が 2 つのプロセッサを搭載したシステムでソリューションをビルドする場合は、2 つのビルド プロセスのみ作成されます。 これらのプロセスは、ソリューションに含まれるすべてのプロジェクトのビルドに再利用されます。

関連項目

MSBuild での複数のプロジェクトの並行ビルド
タスク