强制BuildManager使用另一个版本的MSBuild

本文关键字:版本 MSBuild 另一个 BuildManager 强制 | 更新日期: 2023-09-27 18:17:30

下面的代码尝试使用BuildManager以编程方式构建一个解决方案:

ProjectCollection pc = new ProjectCollection();
pc.DefaultToolsVersion = "12.0";
pc.Loggers.Add(fileLogger);
Dictionary<string, string> globalProperty = new Dictionary<string, string>();
BuildRequestData buildRequest = new BuildRequestData(solutionName, globalProperty, null, new[] { "Build" }, null);
BuildParameters buildParameters = new BuildParameters(pc)
{
    DefaultToolsVersion = "12.0",
    OnlyLogCriticalEvents = false,
    DetailedSummary = true,
    Loggers = new List<Microsoft.Build.Framework.ILogger> { fileLogger }.AsEnumerable()
};
var result = BuildManager.DefaultBuildManager.Build(buildParameters, buildRequest);

当我运行这段代码时,它没有构建任何东西。我可以看到,除了winmdexp.exe的一个特定版本之外,还使用了以下编译器csc.exe:

C:'WINDOWS'Microsoft.NET'Framework'v4.0.30319'Csc.exe
ExportWindowsMDFile:
    C:'Program Files (x86)'Microsoft SDKs'Windows'v8.0A'bin'NETFX 4.0 Tools'winmdexp.exe 

但是当我使用VS IDE成功构建解决方案时,出现以下信息:

C:'Program Files (x86)'MSBuild'12.0'bin'Csc.exe
ExportWindowsMDFile:
    C:'Program Files (x86)'Microsoft SDKs'Windows'v8.1A'bin'NETFX 4.5.1 Tools'winmdexp.exe

为什么这发生在我的代码&我怎样才能改变呢?

强制BuildManager使用另一个版本的MSBuild

从Visual Studio 2013开始,MSBuild不再是。net框架组件。这意味着对打包和部署进行一些重组。旧的MSBuild框架仍然存在于。net框架文件夹中。但是,当您安装Visual Studio 2013时,微软构建工具12.0也安装到C:'Program Files (x86)'MSBuild'12.0.请注意,构建工具可以从Visual Studio中单独获得。

当我第一次尝试这个时,我遇到了和你一样的情况。问题是,您可能已经引用了旧的"4.0"MSBuild框架程序集。您需要引用位于C:'Program Files (x86)'MSBuild'12.0'bin中的新12.0程序集(您必须在VS中浏览以添加引用)。你可能需要微软。构建、Microsoft.Build。引擎和Microsoft.Build.Framework。一旦我更新了这些参考,我看到它在构建时使用了与VS 2013相同的工具。