【发布时间】: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