我想在Visual Studio 2017中以编程方式构建新添加的标准ASP(MVC)web应用程序。因此,我使用一个控制台应用程序,该应用程序使用Microsoft.Build.Evaluation.Project.Build ()打开并编译项目。 构建的控制台应用程序概述如下。需要构建的项目是由Visual Studio中的向导生成的标准ASP MVC .Net应用程序。在我的Visual Studio版本2017这个编译罚款。但是,如果我想用我的应用程序编译它,在开盘的项目,它涉及了错误:以编程方式构建c#web应用程序项目在打开项目时出现错误
发生Microsoft.Build.Exceptions.InvalidProjectFileException 的HResult = 0x80131500 消息=导入的项目“C :\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v15.0 \ WebApplications \ Microsoft.WebApplication.targets“找不到。确认声明中的路径是正确的,并且该文件存在于磁盘上。现在
,如果您在记事本中打开web应用的的csproj文件,它会告诉你,它要找到它的进口项目:
导入项目=“$(VSToolsPath)\ web应用\微软.WebApplication.targets “条件= ” '$(VSToolsPath)'= ''“
根据TOT的错误,在我看来,该toolspath是” C:\ Program Files文件(x86)的\的MSBuild \微软\ VisualStudio \ v15.0“ 但是,WebApplications \ Microsoft.WebApplication.targe ts位于“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中默认创建的Web应用程序。这个项目没有进一步的发展。编译器应用程序也在VS2017上运行,并使用标准的.Net 4.6.2库。 –
对不起延迟回复。我完全用你的代码重现了你的问题。但是这个问题在测试之后没有发生在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检查该项目类的源代码。 –