1

プリコンパイルを有効にしてASP.Net Webアプリケーション(WebフォームとMVC)をコンパイルする必要があります。 Microsoft.CodeAnalysis.MSBuild.MSBuildWorkspaceを使用してプロジェクトを開き、プロジェクトレベルのアセンブリを生成します。私はRazorGeneratorを使用して事前コンパイルすることができますが、これは私のソリューションにさらに複雑さを加えることになります。単にRoslyn Workspaceを使用する方法がありますか?Roslyn Workspaceでプロジェクトをプレコンパイルする方法

+0

MSBuildWorkspaceはRoslyn Workspaceです。私は、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

関連する問題