以编程方式构建c#webapplications项目会给打开项目带来错误

时间:2017-04-07 08:50:59

标签: c# visual-studio web-applications msbuild programmatically

我想在Visual Studio 2017中以编程方式构建一个全新的标准ASP(MVC)web应用程序。因此,我使用一个使用Microsoft.Build.Evaluation.Project.Build()来打开和编译项目的控制台应用程序。 构建的控制台应用程序概述如下。需要构建的项目是一个标准的ASP MVC .Net应用程序,它只是从Visual Studio中的向导生成的。在我的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)' !=''"

根据错误,在我看来,工具路径是" 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文件夹更好的解决方案?

以下是打开并编译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);
        }
    }
}
}

1 个答案:

答案 0 :(得分:0)

  

为什么标准生成的项目指向不存在的目录?为什么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

希望这可以帮到你。