Программная сборка проектов 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 (спасибо за ваш вклад), вы можете оставить свои комментарии и проверить отзывы об этой проблеме. Я также буду следить за этой проблемой, я вышлю вам последний статус этой проблемы.

https://developercommunity.visualstudio.com/content/problem/45156/the-project-class-of-microsoftbuildevaluationproje.html

Надеюсь, это поможет вам.

Другие вопросы по тегам