Мне нужно скомпилировать проект 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.