MSBuild 15:无法实例化 "Error" 任务

MSBuild 15: The "Error" task could not be instantiated

我正在尝试以编程方式构建一个使用 C#7 的项目,因此使用 MSBuild 15,但由于程序集引用不匹配,此任务似乎失败了。

这是我的代码:

        string projectFilePath = Path.Combine(args.Any() ? args.First() :@"C:\Users\newsoni\Documents\Visual Studio 2017\Projects\ConsoleApp2\ConsoleApp2.sln");

        ProjectCollection pc = new ProjectCollection();
        Dictionary<string, string> globalProperty = new Dictionary<string, string>();
        globalProperty.Add("Configuration", "Debug");
        globalProperty.Add("Platform", "x86");

        BuildParameters bp = new BuildParameters(pc);
        bp.Loggers = new ILogger[] { new Logger(), new ConsoleLogger(),  };
        BuildRequestData BuidlRequest = new BuildRequestData(projectFilePath, globalProperty, "4.0", new string[] { "Build" }, null);
        BuildResult buildResult = BuildManager.DefaultBuildManager.Build(bp, BuidlRequest);

错误信息如下:

C:\Users\newsoni\Documents\Visual Studio 2017\Projects\ConsoleApp2\ConsoleApp2.sln.metaproj : error MSB4127: The "Error" task could not be instantiated from the assembly "Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". Please verify the task assembly has been built using the same version of the Microsoft.Build.Framework assembly as the one installed on your computer and that your host application is not missing a binding redirect for Microsoft.Build.Framework. Unable to cast object of type 'Microsoft.Build.Tasks.Error' to type 'Microsoft.Build.Framework.ITask'.
C:\Users\newsoni\Documents\Visual Studio 2017\Projects\ConsoleApp2\ConsoleApp2.sln.metaproj : error MSB4060: The "Error" task has been declared or used incorrectly, or failed during construction. Check the spelling of the task name and the assembly name.

这是一个 link 项目,您可以使用它来重现问题:

https://drive.google.com/a/xibis.com/file/d/0B-mqMIMqm_XHcVRJQmtxQkd1b3c/view?usp=sharing

您必须将代码中的路径更改为您自己机器上的项目,但如果这是 VS 2017 项目或更早版本似乎并不重要。

另一件事可能相关也可能不相关,我注意到此文件夹中的 Microsoft.WebApplication.Build.Tasks.Dll:

C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v15.0\WebApplications

似乎仍然引用 Microsoft.Build.Framework.dll 版本 14,而不是我预期的 15。

我向 Microsoft 提交了支持请求,他们已确认这是 Visual Studio 2017 中的错误。

他们的目标是在 Visual Studio 的更新 3 中修复此问题,但这可能会失败。

本期追踪错误:

https://github.com/Microsoft/msbuild/issues/2194

目前没有针对此 API 的解决方法,但您可以使用 Process 作为替代方法调用 MSBuild exe。

原来我的测试项目有两个问题。首先是由于项目的命名。

但是还有第二个问题是引用不正确。要以编程方式使用 MSBuild 15,您必须安装以下软件包:

Install-Package Microsoft.Build -Version 15.1.1012
Install-Package Microsoft.Build.Framework -Version 15.1.1012
Install-Package Microsoft.Build.Tasks.Core -Version 15.1.1012
Install-Package Microsoft.Build.Utilities.Core -Version 15.1.1012
Install-Package Microsoft.Net.Compilers -Version 2.2.0

还有一个疯狂且完全无法发现的步骤。您现在必须添加对此 DLL 的引用,它应该与您的解决方案文件夹相关:

packages\Microsoft.Net.Compilers.2.2.0\tools\Microsoft.Build.Tasks.CodeAnalysis.dll

如果您直接或通过 Visual Studio 在您的 PC 上安装了 MSBuild,正确的解决方法是使用包 Microsoft.Build.Locator,它将找到已安装的版本并使用它执行构建。

安装这些包

Microsoft.Build
Microsoft.Build.Framework
Microsoft.Build.Locator

需要前 2 个以便代码可以编译,但应从项目输出中排除。

在您的应用程序启动中添加以下代码行,这只需 运行 一次。

Microsoft.Build.Locator.MSBuildLocator.RegisterDefaults();

删除 app.config 中特定于 Microsoft.Build 或其他构建库的任何其他绑定重定向。调用 Microsoft.Build.Locator 程序集将确保这些重定向自动发生。

参考资料