使用多个处理器生成项目

MSBuild 3.5 可以利用具有多个处理器的系统,或多核处理器。它会为每个可用处理器单独创建一个生成进程。例如,如果系统具有四个处理器,则可以创建四个生成进程。MSBuild 可以同时处理这些生成,并减少总体编译时。但是,并行生成的生成方式上引入了一些更改过程将。本主题将讨论这些更改。

项目到项目的引用

当 Microsoft Build Engine 在使用并行生成来生成项目时,如果遇到项目到项目 (P2P) 的引用,将仅生成一次引用。如果两个项目具有同一个 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 在具有两个处理器的系统上生成解决方案,则只能创建两个生成进程。这些进程可重复用于生成解决方案中的所有项目。

请参见

概念

用 MSBuild 并行生成多个项目

MSBuild 任务