1

我需要编译启用预编译的ASP.Net Web应用程序(Web窗体和MVC)。我使用Microsoft.CodeAnalysis.MSBuild.MSBuildWorkspace来打开项目并发出项目级别的程序集。我已经确定RazorGenerator可以用于预编译,但这会给我的解决方案增加额外的复杂性,有没有办法简单地使用Roslyn Workspace?如何使用Roslyn Workspace预编译项目

+0

MSBuildWorkspace是一个Roslyn工作区。我怀疑,尽管RazorGenerator正在为您的项目中的内容生成额外的源代码,因此从MSBuildWorkspace发布编译文件不太可能奏效,因为它不具备所有源代码。 –

+0

@MattWarren:是的Matt Warren,我必须使用MSBuild将web应用程序发布到一个文件夹中,并使用aspnet_comiler.exe预编译发布的工件(请参阅我的答案)。此方法会生成所需的二进制文件,但是我正在为此寻找更强大的代码片段,可能是为了避免MSBuild和aspnet_compiler.exe – Bandara

回答

0

我想出了下面这段代码来生成预编译构建,但是在没有很多文件级操作的情况下寻找更强大的方法。

static void Main(string[] args) 
    { 
     //MVC APP 
     string projectFileName = @"C:\MVCWebApplication\MVCWebApplication\MVCWebApplication.csproj"; 
     string appName = "MVCWebApplication"; 

     //ASP.NET Web Forma App 
     //string projectFileName = @"C:\AapApp\WebGoat\WebGoat.NET.csproj"; 
     //string appName = "WebGoat.NET"; 

     //Build Artifacts will be drop to this location 
     string publishDrop = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); 

     //aspnet compiler will drop precompiled artifacts to this location 
     string precompiledDrop = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); 

     //Publishing the extension without precompile 
     var pc = new ProjectCollection(); 
     var globalProperty = new Dictionary<string, string>(); 
     globalProperty.Add("Configuration", "Debug"); 
     globalProperty.Add("Platform", "x86"); 
     globalProperty.Add("OutputPath", publishDrop); 
     globalProperty.Add("WebPublishMethod", "FileSystem"); 
     globalProperty.Add("EnableUpdateable", "false"); 
     globalProperty.Add("DebugSymbols", "true"); 
     globalProperty.Add("VisualStudioVersion", "14.0");//TODO: Get from IDE 

     var buidlRequest = new BuildRequestData(projectFileName, globalProperty, null, new string[] { "Build" }, null); 
     var buildResult = BuildManager.DefaultBuildManager.Build(new BuildParameters(pc), buidlRequest); 

     //If build errors; then trow 
     if (buildResult.Exception != null) 
     { 
      throw buildResult.Exception; 
     } 

     //Rslyn folder not getting created in required location in VS 2015 MVC app template 
     //https://stackoverflow.com/questions/32780315/could-not-find-a-part-of-the-path-bin-roslyn-csc-exe 
     //Moving it to proper location manually 
     string publish = Path.Combine(publishDrop, "_PublishedWebsites", appName); 
     if (!Directory.Exists(Path.Combine(publish, "bin", "Roslyn")) && 
      Directory.Exists(Path.Combine(publishDrop, "Roslyn"))) 
     { 
      Directory.Move(Path.Combine(publishDrop, "Roslyn"), Path.Combine(publish, "bin", "Roslyn")); 
     } 

     //Executing aspnet compiler to get the final output 
     using (var cmd = new Process()) 
     {     
      cmd.StartInfo.FileName = @"C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe"; 
      cmd.StartInfo.Arguments = @"-v/-p " + publishDrop + @"\_PublishedWebsites\" + appName + " " + precompiledDrop; 
      cmd.StartInfo.RedirectStandardInput = true; 
      cmd.StartInfo.RedirectStandardOutput = true; 
      cmd.StartInfo.CreateNoWindow = true; 
      cmd.StartInfo.UseShellExecute = false; 
      cmd.Start(); 

      cmd.StandardInput.Flush(); 
      cmd.StandardInput.Close(); 
      cmd.WaitForExit(); 
      Console.WriteLine(cmd.StandardOutput.ReadToEnd()); 
      //TODO: Check result for any precompilation errors, 
     } 

     //Cleanup files in final precopiled artifact drop 
     if (Directory.Exists(Path.Combine(precompiledDrop, "bin", "Roslyn"))) 
     { 
      Directory.Delete(Path.Combine(precompiledDrop, "bin", "Roslyn"), true); 
     } 

     Console.ReadKey();   
    } 
+0

此代码可以正常工作并发出预期的吞吐量,但是有没有更强大的方法来执行此操作? – Bandara