1
我需要编译启用预编译的ASP.Net Web应用程序(Web窗体和MVC)。我使用Microsoft.CodeAnalysis.MSBuild.MSBuildWorkspace来打开项目并发出项目级别的程序集。我已经确定RazorGenerator可以用于预编译,但这会给我的解决方案增加额外的复杂性,有没有办法简单地使用Roslyn Workspace?如何使用Roslyn Workspace预编译项目
我需要编译启用预编译的ASP.Net Web应用程序(Web窗体和MVC)。我使用Microsoft.CodeAnalysis.MSBuild.MSBuildWorkspace来打开项目并发出项目级别的程序集。我已经确定RazorGenerator可以用于预编译,但这会给我的解决方案增加额外的复杂性,有没有办法简单地使用Roslyn Workspace?如何使用Roslyn Workspace预编译项目
我想出了下面这段代码来生成预编译构建,但是在没有很多文件级操作的情况下寻找更强大的方法。
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();
}
此代码可以正常工作并发出预期的吞吐量,但是有没有更强大的方法来执行此操作? – Bandara
MSBuildWorkspace是一个Roslyn工作区。我怀疑,尽管RazorGenerator正在为您的项目中的内容生成额外的源代码,因此从MSBuildWorkspace发布编译文件不太可能奏效,因为它不具备所有源代码。 –
@MattWarren:是的Matt Warren,我必须使用MSBuild将web应用程序发布到一个文件夹中,并使用aspnet_comiler.exe预编译发布的工件(请参阅我的答案)。此方法会生成所需的二进制文件,但是我正在为此寻找更强大的代码片段,可能是为了避免MSBuild和aspnet_compiler.exe – Bandara