msbuild.exe有效,但msbuild API没有

时间:2015-11-09 20:05:56

标签: c# visual-studio msbuild

我想使用MSBuild API自动化我的构建,但它给了我一个错误。我在Visual Studio 2015中有自动化项目。它引用了MSBuild v12.0 dll。

我正在使用代码来构建解决方案:

private bool Execute()
{
    var buildProperties = new Dictionary<string, string>();
    buildProperties["Configuration"] = "Debug";
    var solution = @"C:\test\test.sln";
    bool success = Build(solution, buildProperties)
    return success;
}

private bool Build(string solution, Dictionary<string, string> buildProperties)
{
    Guard.ValidPath(solution, nameof(solution));
    BuildParameters buildParam = new BuildParameters()

    BuildRequestData buildRequest = new BuildRequestData(solution, buildProperties, null, new string[] { "Build" }, null);
    BuildResult buildResult = BuildManager.DefaultBuildManager.Build(buildParam, buildRequest);
    if (buildResult.OverallResult == BuildResultCode.Success)
        return true;

    return false;
}

解决方案有一个项目。它的配置:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
etc.

我得到的错误:

  

:错误   C:\ WINDOWS \ Microsoft.NET \框架\ v4.0.30319 \ Microsoft.Data.Entity.targets(65,5):   “EntityDeploySplit”任务无法从中实例化   部件   “C:\ WINDOWS \ Microsoft.NET \框架\ v4.0.30319 \ Microsoft.Data.Entity.Build.Tasks.dll”。   请验证是否已使用相同版本构建任务程序集   Microsoft.Build.Framework程序集作为您安装的程序集   计算机和您的主机应用程序没有错过绑定   重定向到Microsoft.Build.Framework。无法转换类型的对象   键入“Microsoft.Data.Entity.Build.Tasks.EntityDeploySplit”   'Microsoft.Build.Framework.ITask'

知道如何克服这个错误吗?为什么会这样?

2 个答案:

答案 0 :(得分:5)

有类似的问题,但另一个错误消息。我的网络项目无法构建,因为他们试图将他们的任务转发给Microsoft.Build.Framework.ITask。我认为问题是他们使用的是旧版本,因此无法投射到新版本的ITask。为MSBuild 3.5找到了这个解决方案,它也适用于14.0。

MSDN Forum: MSBuild crashes with a "Message" task could not be instantiated exception

我将3.5更改为14.0并将其添加到我的app.config:

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Build.Framework" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="14.0.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

答案 1 :(得分:2)

我设法通过引用Microsoft.Build.Framework v14.0解决了这个问题,其他Microsoft.Build dll是v12.0。现在它有效!