/// <summary> /// 将模板内容编译并输出内存流 /// </summary> /// <param name="templateSource"></param> /// <param name="options"></param> /// <returns></returns> private static MemoryStream CreateAndCompileToStream(string templateSource, ViewEngineCompilationOptions options) { templateSource = WriteDirectives(templateSource, options); var engine = RazorProjectEngine.Create( RazorConfiguration.Default, RazorProjectFileSystem.Create(@"."), (builder) => { builder.SetNamespace(options.TemplateNamespace); }); var fileName = Path.GetRandomFileName(); var document = RazorSourceDocument.Create(templateSource, fileName); var codeDocument = engine.Process( document, null, new List <RazorSourceDocument>(), new List <TagHelperDescriptor>()); var razorCSharpDocument = codeDocument.GetCSharpDocument(); var syntaxTree = CSharpSyntaxTree.ParseText(razorCSharpDocument.GeneratedCode); var compilation = CSharpCompilation.Create( fileName, new[] { syntaxTree }, options.ReferencedAssemblies .Select(ass => MetadataReference.CreateFromFile(ass.Location)) .Concat(options.MetadataReferences) .ToList(), new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); var memoryStream = new MemoryStream(); var emitResult = compilation.Emit(memoryStream); if (!emitResult.Success) { var errors = emitResult.Diagnostics.ToList(); var exception = new ViewEngineCompilationException($"Unable to compile template: {errors.FirstOrDefault()}") { Errors = errors, GeneratedCode = razorCSharpDocument.GeneratedCode }; throw exception; } memoryStream.Position = 0; return(memoryStream); }
/// <summary> /// 写入Razor 命令 /// </summary> /// <param name="content"></param> /// <param name="options"></param> /// <returns></returns> private static string WriteDirectives(string content, ViewEngineCompilationOptions options) { var stringBuilder = new StringBuilder(); stringBuilder.AppendLine($"@inherits {options.Inherits}"); foreach (var entry in options.DefaultUsings) { stringBuilder.AppendLine($"@using {entry}"); } stringBuilder.Append(content); return(stringBuilder.ToString()); }
/// <summary> /// 构造函数 /// </summary> /// <param name="options"></param> public ViewEngineCompilationOptionsBuilder(ViewEngineCompilationOptions options = null) { Options = options ?? new ViewEngineCompilationOptions(); }