我想在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);
}
}
}
}
答案 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开发者社区报告了这个问题(感谢您的贡献),您可以关注您的意见并查看此问题的反馈。我也会跟进这个问题,我会告诉你这个问题的最新情况。
希望这可以帮到你。