Я хочу автоматизировать свои сборки с помощью MSBuild API, но это дает мне ошибку. У меня есть проект автоматизации в Visual Studio 2015. Он ссылается на библиотеки DLL MSBuild v12.0.

Код, который я использую для создания решения:

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 \ Framework \ v4.0.30319 \ Microsoft.Data.Entity.targets (65,5): Не удалось создать экземпляр задачи «EntityDeploySplit» из сборки «C: \ Windows \ Microsoft. NET \ Framework \ 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
Nmktronas 9 Ноя 2015 в 23:05

2 ответа

Лучший ответ

Мне удалось решить эту проблему, сославшись на Microsoft.Build.Framework v14.0, другие библиотеки DLL Microsoft.Build - v12.0. Теперь это работает!

2
Nmktronas 10 Ноя 2015 в 08:46

Была аналогичная проблема, но другое сообщение об ошибке. Мои веб-проекты не могли быть созданы, потому что они пытались передать свои задачи в Microsoft.Build.Framework.ITask. Я думаю, проблема заключалась в том, что они использовали старую версию и поэтому не могли выполнить приведение к новой версии ITask. Нашел это решение для MSBuild 3.5, и оно работает и для 14.0.

Форум MSDN: MSBuild аварийно завершает работу с задачей «Сообщение». Не удалось создать экземпляр исключения.

Я изменил 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>
5
Igor 16 Ноя 2016 в 19:24