Как построить проект C # 6 в приложении WebAPI - PullRequest
0 голосов
/ 07 ноября 2019

Мне нужно скомпилировать проект C # 6/7 в проекте WebAPI (платформа 4.6.2). Логика очень проста - вызывается контроллер WebAPI, и он компилирует некоторый проект для создания сборки.

Приложение WebAPI ссылается на Microsoft.Build.dll и Microsoft.Build.Framework.dll. Все они v15.

Это всего лишь тестовый проект:

public class TestController : ApiController
{
    // GET api/<controller>
    public string Get()
    {
        const string ProjectPath = @"\compiled\Template.csproj";
        const string Configuration = "Debug";
        const string Platform = "AnyCPU";
        const string OutputDir = @"\output";
        const string Target = "build";
        return BuildByManager(ProjectPath, Configuration, Platform, OutputDir, Target);
    }

    public static string BuildByManager(string projectPath, string configuration, string platform, string outputDir
        , string target)
    {
        var globalProperties = new Dictionary<string, string>
        {
            { "Configuration", configuration },
            { "Platform", platform },
            { "OutDir", outputDir }
        };
        var request = new BuildRequestData(projectPath, globalProperties, null, new string[] { target }, null);
        var parameters = new BuildParameters
        {
            DisableInProcNode = true,
            DefaultToolsVersion = "15.0"
        };
        BuildManager buildManager = new BuildManager();
        BuildResult overallResult = buildManager.Build(parameters, request);
        return $"Result {overallResult.OverallResult}";
    }
}

Шаблонный проект не так важен, потому что процесс сборки не запущен. Но некоторый заголовок Template.csproj находится здесь:

<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <OutputType>Library</OutputType>
    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <ProjectGuid>9e0f5a72-b4e7-4522-a375-880cb91495ea</ProjectGuid>
  </PropertyGroup>

IOException генерируется при вызове buildManager.Build:

Исключение: «System.IO.IOException» в Microsoft.Build.dll Дополнительная информация: Неожиданный конец потока при чтении для рукопожатия

Метод BuildByManager прекрасно работает в консольном приложении, но не работает в веб-приложении. Также веб-приложение прекрасно работает с MSBuild v14, но не работает с v15.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...