2017-04-07 69 views
1

我想在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); 
     } 
    } 
} 
} 
+0

您的WebApplication1.csproj项目是否由Visual Studio 2017创建,然后在Visual Studio 2015中开发您的应用程序项目还是反向? –

+0

@Leo:全部在VS2017上运行。 WebApplication1.csproj是VS2017中默认创建的Web应用程序。这个项目没有进一步的发展。编译器应用程序也在VS2017上运行,并使用标准的.Net 4.6.2库。 –

+0

对不起延迟回复。我完全用你的代码重现了你的问题。但是这个问题在测试之后没有发生在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检查该项目类的源代码。 –

回答

0

为什么一个标准生成的项目指向不exsist目录?为什么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开发人员社区(感谢您的贡献),您可以跟随您的意见并检查此问题的反馈。我也会跟进这个问题,我会向你发送这个问题的最新状态。

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

希望这可以帮助你。

相关问题