我正在尝试通过编程方式构建一个使用C#7的项目,因此是MSBUILD 15,但是由于不匹配的汇编参考,此任务似乎失败了。
。这是我的代码:
string projectFilePath = Path.Combine(args.Any() ? args.First() :@"C:UsersnewsoniDocumentsVisual Studio 2017ProjectsConsoleApp2ConsoleApp2.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:UsersnewsoniDocumentsVisual Studio 2017ProjectsConsoleApp2ConsoleApp2.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:UsersnewsoniDocumentsVisual Studio 2017ProjectsConsoleApp2ConsoleApp2.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_xhcm_xhcvrjqmtxqkd1b3c/view?usp = sharing
您必须将代码中的路径更改为您自己的机器上的项目,但是这似乎是VS 2017项目或更早的项目。
我注意到Microsoft.webapplication.build.tasks.dll中的另一件事可能与之相关,在此文件夹中:
c: program文件(x86( msbuild microsoft visualstudio v15.0 webapplications
似乎仍在引用microsoft.build.framework.dll版本14,不是我预期的15。
事实证明,我的测试项目中有两个问题。首先是由于项目的命名。
但是,由于引用不正确,因此存在第二个问题。要使用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
我与Microsoft开了一张支持票,他们已经确认这是Visual Studio 2017中的一个错误。
他们的目标是将其解决到Visual Studio的更新3中,但这可能会滑落。
此问题跟踪错误:
https://github.com/microsoft/msbuild/issues/2194
目前没有解决此API的解决方法,但是您可以使用Process
作为替代方案调用MSBUILD EXE。
如果您直接或通过Visual Studio安装了MSBuild,则适当的修复是使用软件包Microsoft.Build.Locator
,该软件包将找到已安装的版本并使用它执行构建。/p>
安装这些软件包
Microsoft.Build
Microsoft.Build.Framework
Microsoft.Build.Locator
需要前2个,以便代码可以编译,但应从项目输出中排除。
在您的应用程序启动中添加以下代码行,只需运行一次。
Microsoft.Build.Locator.MSBuildLocator.RegisterDefaults();
删除app.config
中特定于Microsoft.Build
或其他构建库中的任何其他绑定重定向。呼叫Microsoft.Build.Locator
组件将确保自动进行这些重定向。
参考
- 更新MSBUILD的现有应用程序15
- github msbuildlocator。