Программная сборка проектов C# webapplications выдает ошибки при открытии проекта
Я хочу программно построить новое добавленное стандартное веб-приложение ASP (MVC) в Visual Studio 2017. Поэтому я использую консольное приложение, которое использует Microsoft.Build.Evaluation.Project.Build(), чтобы открыть и скомпилировать проект. Консольное приложение, которое собирается, описано ниже. Проект, который должен быть собран, является стандартным приложением ASP MVC .Net, только что сгенерированным из мастера в Visual Studio. В моей версии Visual Studio 2017 это компилируется нормально. Однако, если я хочу скомпилировать его, используя мое приложение, при открытии проекта возникает ошибка:
Произошло исключение Microsoft.Build.Exceptions.InvalidProjectFileException. HResult=0x80131500 Сообщение = Не найден импортированный проект "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v15.0\WebApplications\Microsoft.WebApplication.targets". Убедитесь, что путь в объявлении правильный, и что файл существует на диске.
Теперь, если вы откроете файл csproj веб-приложения в блокноте, он сообщит вам, что хочет найти свои импортированные проекты в:
Импортировать проект ="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)'! = ''"
В соответствии с этой ошибкой мне кажется, что путь к инструментам - это "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v15.0", однако WebApplications \ Microsoft.WebApplication.targets находится в "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0"
Обходное решение, очевидно, заключается в том, чтобы скопировать папку WebApplications из v14.0 в v15.0. Затем он компилируется счастливо. Но вопросы таковы: почему стандартный сгенерированный проект указывает на каталог, который не существует? Почему Visual Studio сама может справиться с этим неправильным путем? Есть ли лучшее решение, чем копировать папку WebApplications?
Вот код, который открывает и компилирует веб-проект:
using System;
using Microsoft.Build.Logging;
namespace CompilerApp
{
class Program
{
static void Main(string[] args)
{
//string projectfile = @"C:\temp\CompilerApp\MyCSharp7\MyCSharp7.csproj";
string projectfile = @"C:\temp\CompilerApp\WebApplication1\WebApplication1.csproj";
UnloadAnyProject();
Microsoft.Build.Evaluation.Project p = new Microsoft.Build.Evaluation.Project(projectfile);
FileLogger loggerfile2 = new FileLogger();
loggerfile2.Parameters = @"logfile=C:\temp\CompilerApp\myapp.msbuild.log";
bool buildresult = p.Build(loggerfile2);
if (buildresult)
{
Console.WriteLine("project compiled");
}
else
{
Console.WriteLine("project not compiled, check {0}", @"C:\temp\myapp.msbuild.log");
}
p.Save();
UnloadAnyProject();
}
private static void UnloadAnyProject()
{
Microsoft.Build.Evaluation.ProjectCollection projcoll = Microsoft.Build.Evaluation.ProjectCollection.GlobalProjectCollection;
foreach (Microsoft.Build.Evaluation.Project pr in projcoll.LoadedProjects)
{
Microsoft.Build.Evaluation.ProjectCollection mypcollection = pr.ProjectCollection;
mypcollection.UnloadProject(pr);
}
}
}
}
1 ответ
Почему стандартный сгенерированный проект указывает на каталог, который не существует? Почему Visual Studio сама может справиться с этим неправильным путем? Есть ли лучшее решение, чем копировать папку WebApplications?
Я полностью воспроизвел вашу проблему с вашим кодом. Но эта проблема не возникла в Visual Studio 2015 с теми же сценариями, которые Visual Studio компилирует после тестирования.
После более подробного изучения я заметил, что класс проекта "Microsoft.Build.Evaluation.Project" не прочитал правильный путь Visual Studio 2017, траектория на VS2017 должна быть C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\VisualStudio\v15. 0, но я не смог проверить исходный код этого класса проекта с помощью ILSpy.
Поэтому я сообщил об этой проблеме сообществу разработчиков Visual Studio (спасибо за ваш вклад), вы можете оставить свои комментарии и проверить отзывы об этой проблеме. Я также буду следить за этой проблемой, я вышлю вам последний статус этой проблемы.
Надеюсь, это поможет вам.