【问题标题】:Programmatically building c# webapplications projects gives errors on opening project以编程方式构建 c# webapplications 项目会在打开项目时出错
【发布时间】:2017-09-02 13:55:23
【问题描述】:

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

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

现在,如果您在记事本中打开 web 应用程序的 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 文件夹更好的解决方案?

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

【问题讨论】:

  • 您的 WebApplication1.csproj 项目是由 Visual Studio 2017 创建的,然后在 Visual Studio 2015 中开发您的应用程序项目还是反过来?
  • @Leo :一切都在 VS2017 上运行。 WebApplication1.csproj 是 VS2017 中默认创建的 webapp。这个项目没有进一步的发展。编译器应用也在 VS2017 上运行,并使用标准的 .Net 4.6.2 库。
  • 抱歉回复延迟。我已经用你的代码完全重现了你的问题。但是在Visual Studio 2015和Visual Studio compile after test上没有出现这个问题。经过更多调查,我注意到“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 开发者社区。并将评论转换为有利于其他有相同问题的社区的答案。

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


【解决方案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 开发者社区(感谢您的贡献),您可以关注您的 cmets 并查看此问题的反馈。我也会跟进这个问题,我会把这个问题的最新状态发给你。

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

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多