MSBuild 15:无法实例化“错误”任务

时间:2017-04-27 15:43:52

标签: msbuild c#-7.0 msbuild-15

我正在尝试以编程方式构建一个使用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.

以下是可用于重新创建问题的项目的链接:

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。

3 个答案:

答案 0 :(得分:6)

事实证明我的测试项目有两个问题。第一个是由于项目的命名。

然而,第二个问题是由于引用不正确。要以编程方式使用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的引用,该引用应该与您的解决方案文件夹相关:

包\ Microsoft.Net.Compilers.2.2.0 \工具\ Microsoft.Build.Tasks.CodeAnalysis.dll

答案 1 :(得分:0)

我向微软开了一张支持票,他们已经确认这是Visual Studio 2017中的一个错误。

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

此问题跟踪错误:

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

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

答案 2 :(得分:0)

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

安装这些软件包

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

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

在应用程序启动时,添加以下代码行,只需运行一次即可。

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

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

参考