Visual Studio 以编程方式构建C#Web应用程序项目在打开项目时出错

mzaanser  于 2023-05-01  发布在  C#
关注(0)|答案(1)|浏览(151)

我想在Visual Studio 2017中以编程方式构建一个新添加的标准ASP(MVC)Web应用程序。因此,我使用了使用Microsoft的控制台应用程序。Build.Evaluation.Build()打开并编译项目。下面概述了生成的控制台应用程序。需要构建的项目是一个标准的ASP MVC。NET应用程序刚刚从Visual Studio中的向导生成。在我的Visual Studio 2017版本中,这编译得很好。但是,如果我想使用我的应用程序编译它,在打开项目时,它会出现错误:
Microsoft.Build.发生了InvalidProjectFileException HResult=0x80131500消息=导入的项目“C:\Program Files(x86)\MSBuild\Microsoft\VisualStudio\v15.0\WebApplications\Microsoft。Web应用程序。找不到目标。确认声明中的路径正确,并且文件存在于磁盘上。
现在,如果你在记事本中打开web应用程序的csproj文件,它会告诉你它想在以下位置找到它导入的项目:

Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''"

根据错误,在我看来,工具路径是“C:\Program Files(x86)\MSBuild\Microsoft\VisualStudio\v15。0”但是WebApplications\Microsoft.Web应用程序。目标位于“C:\Program Files(x86)\MSBuild\Microsoft\VisualStudio\v14.0”
一个解决方法显然是从v14复制WebApplications文件夹。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);
        }
    }
}
}
s4n0splo

s4n0splo1#

为什么一个标准生成的项目指向一个不存在的目录?为什么Visual Studio本身可以科普这个错误的路径?有比复制WebApplications文件夹更好的解决方案吗?
我已经完全复制了你的代码的问题。但是这个问题在Visual Studio 2015上没有发生,并且Visual Studio在测试后编译。
经过更多的调查,我已经注意到“微软。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
希望这能帮到你。

相关问题