BuildManager使用另一个版本的MSBuild

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

 ProjectCollection pc = new ProjectCollection(); pc.DefaultToolsVersion = "12.0"; pc.Loggers.Add(fileLogger); Dictionary globalProperty = new Dictionary(); 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 { fileLogger }.AsEnumerable() }; var result = BuildManager.DefaultBuildManager.Build(buildParameters, buildRequest); 

当我运行此代码(它没有构建任何btw)时,我可以看到除了一个特定版本的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 

为什么会在我的代码中发生这种情况?如何更改它?

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

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