1

Ich muss eine ASP.Net-Webanwendungen (Web Forms und MVC) mit vorkompilieren aktiviert kompilieren. Ich verwende Microsoft.CodeAnalysis.MSBuild.MSBuildWorkspace, um das Projekt zu öffnen und Projektebenen-Assemblys zu senden. Ich habe festgestellt, dass RazorGenerator zur Vorkompilierung verwendet werden kann, aber dies wird meiner Lösung zusätzliche Komplexität hinzufügen. Gibt es eine Möglichkeit, dies einfach mit Roslyn Workspace zu tun?So kompilieren Sie Projekte mit Roslyn Workspace

+0

MSBuildWorkspace ist ein Roslyn-Arbeitsbereich. Ich vermute jedoch, dass RazorGenerator zusätzlichen Quellcode zu dem, was in Ihrem Projekt ist, generiert, so dass die Übertragung aus dem MSBuildWorkspace wahrscheinlich nicht funktioniert, da es nicht die gesamte Quelle hat. –

+0

@MattWarren: Ja Matt Warren, ich musste die Webanwendung in einem Ordner mit MSBuild veröffentlichen und aspnet_comiler.exe verwenden, um die veröffentlichten Artefakte vorkompilieren (Bitte beziehen Sie sich auf meine Antwort). Diese Methode generiert erforderliche Binärdateien, aber ich suche nach einem robusteren Code dafür, vielleicht MSBuild und aspnet_compiler.exe zu vermeiden – Bandara

Antwort

0

Ich habe folgenden Code entwickelt, um den vorkompilierten Build zu generieren, jedoch ohne viele Operationen auf Dateiebene einen robusteren Weg zu finden.

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

Dieser Code funktioniert gut und emittiert erwarteten ouput, aber gibt es eine robustere Möglichkeit, dies zu tun? – Bandara

Verwandte Themen