以编程方式构建c#webapplications项目会在打开项目时出错

以编程方式构建c#webapplications项目会在打开项目时出错,c#,visual-studio,web-applications,msbuild,programmatically,C#,Visual Studio,Web Applications,Msbuild,Programmatically,我想在Visual Studio 2017中以编程方式构建新添加的标准ASP(MVC)Web应用程序。因此,我使用一个控制台应用程序,该应用程序使用Microsoft.Build.Evaluation.Project.Build()打开并编译项目。 构建的控制台应用程序概述如下。需要构建的项目是刚刚从VisualStudio中的向导生成的标准ASP MVC.Net应用程序。在我的Visual Studio 2017版中,这可以很好地编译。但是,如果我想使用我的应用程序编译它,在项目开始时,它会出

我想在Visual Studio 2017中以编程方式构建新添加的标准ASP(MVC)Web应用程序。因此,我使用一个控制台应用程序,该应用程序使用Microsoft.Build.Evaluation.Project.Build()打开并编译项目。 构建的控制台应用程序概述如下。需要构建的项目是刚刚从VisualStudio中的向导生成的标准ASP MVC.Net应用程序。在我的Visual Studio 2017版中,这可以很好地编译。但是,如果我想使用我的应用程序编译它,在项目开始时,它会出现以下错误:

发生Microsoft.Build.Exceptions.InvalidProjectFileException HResult=0x80131500 Message=未找到导入的项目“C:\Program Files(x86)\MSBuild\Microsoft\VisualStudio\v15.0\WebApplications\Microsoft.WebApplication.targets”。确认声明中的路径正确,并且文件存在于磁盘上

现在,如果您在记事本中打开webapplication的csproj文件,它会告诉您它希望在以下位置找到导入的项目:

导入项目=“$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets”条件=“'$(VSToolsPath)!=”

根据错误,我认为工具SPATH是“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。然后,它很高兴地编译。但问题是: 为什么标准生成的项目指向不存在的目录? 为什么VisualStudio本身能够处理这条错误的道路? 有没有比复制WebApplications文件夹更好的解决方案

以下是打开和编译web项目的代码:

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);
        }
    }
}
}
为什么标准生成的项目指向不存在的目录?为什么VisualStudio本身能够处理这条错误的道路?有没有比复制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检查该项目类的源代码

因此,我已经向VisualStudioDeveloper社区报告了这个问题(感谢您的贡献),您可以跟随您的评论并检查这个问题的反馈。我也会跟进这个问题,我会把这个问题的最新状态发给你

希望这能帮助你

为什么标准生成的项目指向不存在的目录?为什么VisualStudio本身能够处理这条错误的道路?有没有比复制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检查该项目类的源代码

因此,我已经向VisualStudioDeveloper社区报告了这个问题(感谢您的贡献),您可以跟随您的评论并检查这个问题的反馈。我也会跟进这个问题,我会把这个问题的最新状态发给你


希望这能对您有所帮助。

您的WebApplication1.csproj项目是由Visual Studio 2017创建的,然后在Visual Studio 2015中开发您的应用程序项目还是反向开发?@Leo:All在VS2017上运行。WebApplication1.csproj是VS2017中默认创建的webapp。该项目没有进一步发展。编译器应用程序也在VS2017上运行,并且正在使用标准的.Net 4.6.2库。很抱歉延迟回复。我完全复制了你的代码问题。但在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检查该项目类的源代码。@Leo,谢谢你的努力。您所描述的问题正是问题的根源。我已经向Visual Studio开发人员社区报告了这一点。并将评论转换为对其他有相同问题的社区有益的答案。您的WebApplication1.csproj项目是由Visual Studio 2017创建的,然后在Visual Studio 2015中开发您的应用程序项目,还是相反?@Leo:All在VS2017上运行。WebApplication1.csproj是VS2017中默认创建的webapp。该项目没有进一步发展。编译器应用程序也在VS2017上运行,并且正在使用标准的.Net 4.6.2库。很抱歉延迟回复。我完全复制了你的代码问题。但在Visual Studio 2015和Visual Studio测试后编译中未出现此问题。经过进一步调查,我注意到“Microsoft.Build.Evaluation.project”的项目类没有阅读Visual Studio 2017的正确路径